diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..9498e50b
Binary files /dev/null and b/.DS_Store differ
diff --git a/.babelrc b/.babelrc
index 09b5e3c3..feccf134 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,33 +1,31 @@
{
+ "presets": [
+ "@babel/env",
+ "@babel/typescript"
+ ],
"plugins": [
- "check-es2015-constants",
- "transform-es2015-arrow-functions",
- "transform-es2015-block-scoped-functions",
- "transform-es2015-block-scoping",
- ["transform-es2015-classes", { "loose": true }],
- ["transform-es2015-computed-properties", { "loose": true }],
- ["transform-es2015-destructuring", { "loose": true }],
- ["transform-es2015-for-of", { "loose": true }],
- "transform-es2015-function-name",
- "transform-es2015-literals",
-
- "transform-es2015-object-super",
- "transform-es2015-parameters",
- "transform-es2015-shorthand-properties",
- ["transform-es2015-spread", { "loose": true }],
- "transform-es2015-sticky-regex",
- ["transform-es2015-template-literals", { "loose": true }],
- "transform-es2015-unicode-regex",
- "transform-es2015-typeof-symbol",
- "transform-object-rest-spread",
- "lodash"
-],
-"env": {
- "commonjs": {
+ "@babel/proposal-class-properties",
+ "@babel/proposal-object-rest-spread",
+ "@babel/transform-runtime"
+ ],
+ "env": {
+ "node": {
"plugins": [
- ["transform-es2015-modules-commonjs", { "loose": true }],
- "add-module-exports"
+ "add-module-exports"
+ ]
+ },
+ "test": {
+ "plugins": [
+ "add-module-exports",
+ [
+ "istanbul",
+ {
+ "exclude": [
+ "**/*.spec.js"
+ ]
+ }
+ ]
]
}
}
-}
+}
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
index 628f4846..623e6d00 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,35 +1,21 @@
{
- "settings" : {
- "ecmascript": 6,
- "jsx": true
+ "extends": "eslint:recommended",
+ "parserOptions": {
+ "ecmaVersion": 2018,
+ "sourceType": "module"
},
"env": {
"browser": true,
+ "es6": true,
"node": true
},
- "ecmaFeatures": {
- "blockBindings": true,
- "forOf": true,
- "defaultParams": true,
- "globalReturn": false,
- "modules": true,
- "objectLiteralShorthandMethods": true,
- "objectLiteralShorthandProperties": true,
- "templateStrings": true,
- "spread": true,
- "jsx": true,
- "arrowFunctions": true,
- "classes": true,
- "destructuring": true,
- "objectLiteralComputedProperties": true
- },
"globals": {
- "ENV": true,
- "beforeEach": true,
- "describe": true,
- "it": true,
- "expect": true,
- "sinon": true
+ "ENV": "readonly",
+ "beforeEach": "readonly",
+ "describe": "readonly",
+ "it": "readonly",
+ "expect": "readonly",
+ "sinon": "readonly"
},
"rules": {
"no-unused-expressions": 1,
@@ -42,7 +28,10 @@
"eqeqeq": 2,
"guard-for-in": 2,
"wrap-iife": 0,
- "no-use-before-define": [1, "nofunc"],
+ "no-use-before-define": [
+ 1,
+ "nofunc"
+ ],
"new-cap": 2,
"quotes": 0,
"strict": 0,
@@ -52,18 +41,44 @@
"no-plusplus": 0,
"no-unused-vars": 1,
"no-trailing-spaces": 2,
-
// STYLE
- "max-params": [2, 7],
- "key-spacing": [1, {
- beforeColon: false,
- afterColon: true
- }],
- "indent": [2, 4],
- "brace-style": [2, "1tbs"],
- "comma-spacing": [2, {before: false, after: true}],
- "comma-style": [2, "last"],
- "consistent-this": [1, "self"],
+ "max-params": [
+ 2,
+ 7
+ ],
+ "key-spacing": [
+ 1,
+ {
+ "beforeColon": false,
+ "afterColon": true
+ }
+ ],
+ "indent": [
+ "error",
+ 4,
+ {
+ "SwitchCase": 1
+ }
+ ],
+ "brace-style": [
+ 2,
+ "1tbs"
+ ],
+ "comma-spacing": [
+ 2,
+ {
+ "before": false,
+ "after": true
+ }
+ ],
+ "comma-style": [
+ 2,
+ "last"
+ ],
+ "consistent-this": [
+ 1,
+ "self"
+ ],
"eol-last": 0,
"new-parens": 2,
"no-array-constructor": 2,
@@ -74,12 +89,20 @@
"no-spaced-func": 1,
"no-shadow": 2,
"no-undef": 2,
- "padded-blocks": [2, "never"],
- "semi": [2, "always"],
- "space-after-keywords": [2, "always"],
+ "padded-blocks": [
+ 2,
+ "never"
+ ],
+ "semi": [
+ 2,
+ "always"
+ ],
"space-infix-ops": 2,
- "max-len" : [1, 120],
+ "max-len": [
+ 1,
+ 120
+ ],
"consistent-return": 2,
"yoda": 2
}
-}
+}
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index a57c82d8..00000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,21 +0,0 @@
-module.exports = function(grunt) {
- // Project configuration.
- grunt.initConfig({
- pkg: grunt.file.readJSON('package.json'),
- karma: {
- unit: {
- configFile: 'karma.conf.js'
- },
- integration: {
- configFile: 'karma-integration.conf.js'
- }
- }
- });
-
- grunt.loadNpmTasks('grunt-karma');
-
- grunt.loadTasks('tasks');
-
- grunt.registerTask('test', ['karma']);
- grunt.registerTask('integrationtest', ['karma:integration']);
-};
diff --git a/README.md b/README.md
index b14c8cf2..00b086b8 100644
--- a/README.md
+++ b/README.md
@@ -91,12 +91,11 @@ The above condition evaluates to:
| Chrome | `true` |
| Firefox | `true` |
| IE 11 | `false` |
-| Safari iOS | `true` |
+| Safari iOS | `true` |
## Installing
-QuaggaJS can be installed using __npm__, __bower__, or by including it with
-the __script__ tag.
+QuaggaJS can be installed using __npm__ or by including it with the __script__ tag.
### NPM
@@ -115,14 +114,6 @@ Currently, the full functionality is only available through the browser. When
using QuaggaJS within __node__, only file-based decoding is available. See the
example for [node_examples](#node-example).
-### Bower
-
-You can also install QuaggaJS through __bower__:
-
-```console
-> bower install quagga
-```
-
### Script-Tag Anno 1998
You can simply include `dist/quagga.min.js` in your project and you are ready
@@ -181,19 +172,19 @@ node.
```javascript
Quagga.init({
inputStream : {
- name : "Live",
- type : "LiveStream",
+ name : 'Live',
+ type : 'LiveStream',
target: document.querySelector('#yourElement') // Or '#yourElement' (optional)
},
decoder : {
- readers : ["code_128_reader"]
+ readers : ['code_128_reader']
}
- }, function(err) {
+ }, function (err) {
if (err) {
console.log(err);
return
}
- console.log("Initialization finished. Ready to start");
+ console.log('Initialization finished. Ready to start');
Quagga.start();
});
```
@@ -475,7 +466,7 @@ supplements you have to provide them in the configuration as followed:
```javascript
decoder: {
readers: [{
- format: "ean_reader",
+ format: 'ean_reader',
config: {
supplements: [
'ean_5_reader', 'ean_2_reader'
@@ -508,7 +499,7 @@ Only two properties are relevant for the use in Quagga (`halfSample` and
```javascript
{
halfSample: true,
- patchSize: "medium", // x-small, small, medium, large, x-large
+ patchSize: 'medium', // x-small, small, medium, large, x-large
debug: {
showCanvas: false,
showPatches: false,
@@ -552,43 +543,43 @@ locating-mechanism for more robust results.
```javascript
Quagga.decodeSingle({
decoder: {
- readers: ["code_128_reader"] // List of active readers
+ readers: ['code_128_reader'] // List of active readers
},
locate: true, // try to locate the barcode in the image
src: '/test/fixtures/code_128/image-001.jpg' // or 'data:image/jpg;base64,' + data
-}, function(result){
- if(result.codeResult) {
- console.log("result", result.codeResult.code);
+}, function (result) {
+ if (result.codeResult) {
+ console.log('result', result.codeResult.code);
} else {
- console.log("not detected");
+ console.log('not detected');
}
});
```
### Using node
-The following example illustrates the use of QuaggaJS within a node
-environment. It's almost identical to the browser version with the difference
-that node does not support web-workers out of the box. Therefore the config
+The following example illustrates the use of QuaggaJS within a node environment.
+It's almost identical to the browser version with the difference
+that node does not support web workers out of the box. Therefore the config
property `numOfWorkers` must be explicitly set to `0`.
```javascript
var Quagga = require('quagga').default;
Quagga.decodeSingle({
- src: "image-abc-123.jpg",
+ src: 'image-abc-123.jpg',
numOfWorkers: 0, // Needs to be 0 when used within node
inputStream: {
- size: 800 // restrict input-size to be 800px in width (long-side)
+ size: 800 // restrict input size to be 800px in width (long side)
},
decoder: {
- readers: ["code_128_reader"] // List of active readers
+ readers: ['code_128_reader'] // List of active readers
},
}, function(result) {
if(result.codeResult) {
- console.log("result", result.codeResult.code);
+ console.log('result', result.codeResult.code);
} else {
- console.log("not detected");
+ console.log('not detected');
}
});
```
@@ -601,11 +592,11 @@ A growing collection of tips & tricks to improve the various aspects of Quagga.
Barcodes too far away from the camera, or a lens too close to the object
result in poor recognition rates and Quagga might respond with a lot of
-false-positives.
+false positives.
Starting in Chrome 59 you can now make use of `capabilities` and directly
control the zoom of the camera. Head over to the
-[web-cam demo](https://serratus.github.io/quaggaJS/examples/live_w_locator.html)
+[web cam demo](https://serratus.github.io/quaggaJS/examples/live_w_locator.html)
and check out the __Zoom__ feature.
You can read more about those `capabilities` in
@@ -618,7 +609,7 @@ recognition logic.
Since Chrome 59 you can turn on/off the __Torch__ of our device and vastly
improve the quality of the images. Head over to the
-[web-cam demo](https://serratus.github.io/quaggaJS/examples/live_w_locator.html)
+[web cam demo](https://serratus.github.io/quaggaJS/examples/live_w_locator.html)
and check out the __Torch__ feature.
To find out more about this feature [read on](https://www.oberhofer.co/mediastreamtrack-and-its-capabilities).
@@ -626,8 +617,8 @@ To find out more about this feature [read on](https://www.oberhofer.co/mediastre
## Tests
Unit Tests can be run with [Karma][karmaUrl] and written using
-[Mocha][mochaUrl], [Chai][chaiUrl] and [SinonJS][sinonUrl]. Coverage reports are
-automatically generated in the coverage/ folder.
+[Mocha][mochaUrl], [Chai][chaiUrl] and [SinonJS][sinonUrl].
+Coverage reports are automatically generated in the coverage/ folder.
```console
> npm install
@@ -639,7 +630,7 @@ In case you want to take a deeper dive into the inner workings of Quagga, get to
know the _debugging_ capabilities of the current implementation. The various
flags exposed through the `config` object give you the abilily to visualize
almost every step in the processing. Because of the introduction of the
-web-workers, and their restriction not to have access to the DOM, the
+web workers, and their restriction not to have access to the DOM, the
configuration must be explicitly set to `config.numOfWorkers = 0` in order to
work.
@@ -652,19 +643,19 @@ bugs in the implementation.
### Creating a ``ResultCollector``
-You can easily create a new ``ResultCollector`` by calling its ``create``
-method with a configuration.
+You can easily create a new ``ResultCollector`` by calling its constructor
+with a configuration.
```javascript
-var resultCollector = Quagga.ResultCollector.create({
+const resultCollector = new Quagga.ResultCollector({
capture: true, // keep track of the image producing this result
capacity: 20, // maximum number of results to store
blacklist: [ // list containing codes which should not be recorded
- {code: "3574660239843", format: "ean_13"}],
- filter: function(codeResult) {
+ {code: '3574660239843', format: 'ean_13'}],
+ filter: function (codeResult) {
// only store results which match this constraint
// returns true/false
- // e.g.: return codeResult.format === "ean_13";
+ // e.g.: return codeResult.format === 'ean_13';
return true;
}
});
@@ -684,7 +675,7 @@ do not fit into a certain schema. Calling ``getResults`` on the
```javascript
{
codeResult: {}, // same as in onDetected event
- frame: "data:image/png;base64,iVBOR..." // dataURL of the gray-scaled image
+ frame: 'data:image/png;base64,iVBOR...' // dataURL of the gray-scaled image
}
```
@@ -705,6 +696,18 @@ on the ``singleChannel`` flag in the configuration when using ``decodeSingle``.
## Changelog
+### 2019-07-31
+- Internal Changes
+ - Converted to TypeScript
+ - Upgraded tooling to Webpack 4.38, Babel 7.5, Karma 4.2, Chai 4.2, Sinon 7.3
+ - Removed redundant files
+- Improvements
+ - Removed all 3rd party dependencies for Web version
+ - Changed ImageDebug API
+ - Changed ``Box`` interface to be ``[Point, Point, Point, Point]``
+ - Improved performance by utilizing ES2015+ features, bitwise operators, etc.
+ - Added support for ``area`` measured in pixels (px)
+
### 2017-06-07
- Improvements
- added `muted` and `playsinline` to `` to make it work for Safari 11
@@ -759,18 +762,15 @@ Take a look at the release-notes (
[0.10.0](https://github.com/serratus/quaggaJS/releases/tag/v0.10.0))
### 2016-02-18
-
- Internal Changes
- Restructuring into meaningful folders
- Removing debug-code in production build
-
### 2016-02-15
Take a look at the release-notes (
[0.9.0](https://github.com/serratus/quaggaJS/releases/tag/v0.9.0))
### 2015-11-22
-
- Fixes
- Fixed inconsistencies for Code 128 decoding (See
[\#76](https://github.com/serratus/quaggaJS/issues/76))
diff --git a/bower.json b/bower.json
deleted file mode 100644
index ef8b1a98..00000000
--- a/bower.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "quagga",
- "version": "0.12.1",
- "description": "An advanced barcode-scanner written in JavaScript",
- "main": "dist/quagga.js",
- "ignore": [
- "build",
- "doc",
- "spec",
- "src",
- "tasks",
- "test",
- ".gitignore",
- ".npmignore",
- "Gruntfile.js",
- "karma-integration.conf.js",
- "karma.conf.js",
- "package.json",
- "test-main.js"
- ],
- "devDependencies": {
- "async": "^0.9.0",
- "grunt": "~0.4.5",
- "grunt-contrib-jshint": "~0.10.0",
- "grunt-contrib-nodeunit": "~0.4.1",
- "grunt-contrib-uglify": "~0.5.0",
- "grunt-karma": "^0.9.0",
- "grunt-requirejs": "^0.4.2",
- "karma": "latest",
- "karma-chai": "latest",
- "karma-chrome-launcher": "^0.1.12",
- "karma-coverage": "^0.3.1",
- "karma-mocha": "latest",
- "karma-phantomjs-launcher": "^0.1.4",
- "karma-requirejs": "^0.2.2",
- "karma-sinon": "^1.0.4",
- "karma-sinon-chai": "^0.2.0",
- "sinon": "^1.12.1"
- },
- "directories": {
- "doc": "doc"
- },
- "scripts": {
- "test": "karma start"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/serratus/quaggaJS.git"
- },
- "bugs": {
- "url": "https://github.com/serratus/quaggaJS/issues"
- },
- "keywords": [
- "quagga",
- "quaggajs",
- "barcode",
- "ean",
- "code128",
- "code39",
- "codabar",
- "i2of5",
- "upc",
- "getusermedia",
- "imageprocessing"
- ],
- "author": "Christoph Oberhofer ",
- "license": "MIT"
-}
diff --git a/build/end.frag b/build/end.frag
deleted file mode 100644
index c1167bbc..00000000
--- a/build/end.frag
+++ /dev/null
@@ -1,2 +0,0 @@
- return require('quagga');
-}));
\ No newline at end of file
diff --git a/build/start.frag b/build/start.frag
deleted file mode 100644
index 73729274..00000000
--- a/build/start.frag
+++ /dev/null
@@ -1,11 +0,0 @@
-(function (root, factory) {
- var factorySource = factory.toString();
-
- if (typeof module !== 'undefined') {
- module.exports = factory(factorySource);
- } else {
- //Browser globals case. Just assign the
- //result to a property on the global.
- root.Quagga = factory(factorySource);
- }
-}(this, function (__factorySource__) {
\ No newline at end of file
diff --git a/dist/quagga.d.ts b/dist/quagga.d.ts
new file mode 100644
index 00000000..f6c7e908
--- /dev/null
+++ b/dist/quagga.d.ts
@@ -0,0 +1,1115 @@
+declare module "common/polyfills" {
+ export function polyfills(): void;
+ const _default: void;
+ export default _default;
+}
+declare module "common/point" {
+ export interface Point {
+ x: number;
+ y: number;
+ }
+}
+declare module "common/image-debug" {
+ import { Point } from "common/point";
+ export const ImageDebug: {
+ drawPath(path: Point[], context: CanvasRenderingContext2D, color: string, lineWidth: number): void;
+ drawImage(imageData: Uint8Array, width: number, height: number, context: CanvasRenderingContext2D): boolean;
+ };
+}
+declare module "common/box" {
+ import { Point } from "common/point";
+ export type Box = [Point, Point, Point, Point];
+}
+declare module "common/moment" {
+ export interface Moment {
+ x?: number;
+ y?: number;
+ m00?: number;
+ m01?: number;
+ m10?: number;
+ m11?: number;
+ m02?: number;
+ m20?: number;
+ theta?: number;
+ rad?: number;
+ }
+}
+declare module "common/hsv2rgb" {
+ export type HSV = [number, number, number];
+ export type RGB = [number, number, number];
+ export function hsv2rgb(hsv: HSV, rgb?: RGB): RGB;
+}
+declare module "common/image-wrapper" {
+ import { Moment } from "common/moment";
+ import { Point } from "common/point";
+ type ArrayType = Array | Uint8Array | Int32Array;
+ /**
+ * Represents a basic image combining the data and size.
+ * In addition, some methods for manipulation are contained.
+ */
+ export class ImageWrapper {
+ data: T | Uint8Array;
+ size: Point;
+ /**
+ * @param size The size of the image in pixel
+ * @param data If given, a flat array containing the pixel data
+ * @param arrayType If given, the desired DataType of the Array (may be typed/non-typed)
+ * @param initialize Indicating if the array should be initialized on creation.
+ */
+ constructor(size: Point, data?: T, arrayType?: {
+ new (_: number): T | Uint8Array;
+ }, initialize?: boolean);
+ /**
+ * Tests if a position is within the image with a given offset
+ * @param point The location to test
+ * @param border The padding value in pixels
+ * @returns true if location inside the image's border, false otherwise
+ * @see cvd/image.h
+ */
+ inImageWithBorder(point: Point, border: number): boolean;
+ /**
+ * Creates an {ImageWrapper) and copies the needed underlying image-data area
+ * @param imageWrapper The target {ImageWrapper} where the data should be copied
+ * @param fromX The horizontal position where to copy from
+ * @param fromY The vertical position where to copy from
+ */
+ subImageAsCopy(imageWrapper: ImageWrapper, fromX: number, fromY: number): void;
+ /**
+ * Retrieves a given pixel position from the image
+ * @param x The x-position
+ * @param y The y-position
+ * @returns The grayscale value at the pixel-position
+ */
+ get(x: number, y: number): number;
+ /**
+ * Sets a given pixel position in the image
+ * @param x The x-position
+ * @param y The y-position
+ * @param value The grayscale value to set
+ * @returns The Image itself (for possible chaining)
+ */
+ set(x: number, y: number, value: number): ImageWrapper;
+ /**
+ * Sets the border of the image (1 pixel) to zero
+ */
+ zeroBorder(): void;
+ /**
+ * Inverts a binary image in place
+ */
+ invert(): void;
+ moments(labelCount: number): Array;
+ /**
+ * Displays the {ImageWrapper} in a given canvas
+ * @param context The rendering context to write to
+ * @param scale Scale which is applied to each pixel-value
+ */
+ show(context: CanvasRenderingContext2D, scale: number): void;
+ /**
+ * Displays the part of the image in a given canvas
+ * @param context The rendering context to write to
+ * @param scale Scale which is applied to each pixel-value
+ * @param fromX The horizontal position where to overlay from
+ * @param fromY The vertical position where to overlay from
+ */
+ overlay(context: CanvasRenderingContext2D, scale: number, fromX: number, fromY: number): void;
+ }
+}
+declare module "reader/barcode-reader" {
+ export enum BarcodeDirection {
+ Forward = 1,
+ Reverse = -1
+ }
+ export type BarcodeFormat = string;
+ export type BarcodeReaderType = string;
+ export type BarcodeReaderDeclaration = BarcodeReaderType | {
+ format: BarcodeReaderType;
+ config: BarcodeReaderConfig;
+ };
+ export interface BarcodeReaderConfig {
+ normalizeBarSpaceWidth?: boolean;
+ supplements?: Array;
+ }
+ export interface BarcodeCorrection {
+ bar: number;
+ space: number;
+ }
+ export interface BarcodeInfo {
+ code?: number;
+ correction?: BarcodeCorrection;
+ end?: number;
+ endCounter?: number;
+ error?: number;
+ start?: number;
+ startCounter?: number;
+ }
+ export interface Barcode {
+ code?: string;
+ codeset?: number;
+ correction?: BarcodeCorrection;
+ decodedCodes?: Array;
+ direction?: BarcodeDirection;
+ end?: number;
+ endInfo?: BarcodeInfo;
+ format?: BarcodeFormat;
+ start?: number;
+ startInfo?: BarcodeInfo;
+ supplement?: Barcode;
+ }
+ export abstract class BarcodeReader {
+ protected _singleCodeError: number;
+ protected _averageCodeError: number;
+ protected _format: BarcodeFormat;
+ protected _row: Array;
+ config: BarcodeReaderConfig;
+ supplements: Array;
+ static readonly Exception: {
+ StartNotFoundException: string;
+ CodeNotFoundException: string;
+ PatternNotFoundException: string;
+ };
+ readonly SINGLE_CODE_ERROR: number;
+ readonly AVERAGE_CODE_ERROR: number;
+ readonly FORMAT: BarcodeFormat;
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ abstract decode(row?: Array, start?: number): Barcode;
+ protected _findPattern(pattern: ReadonlyArray, offset: number, isWhite: 0 | 1, tryHarder: boolean): BarcodeInfo;
+ protected _nextUnset(line: ReadonlyArray, start?: number): number;
+ protected _nextSet(line: ReadonlyArray, start?: number): number;
+ protected _matchRange(start: number, end: number, value: number): boolean;
+ protected _matchPattern(counter: ReadonlyArray, code: ReadonlyArray, maxSingleError?: number): number;
+ protected _correctBars(counter: Array, correction: number, indices: Array): void;
+ decodePattern(pattern: Array): Barcode;
+ _fillCounters(offset: number, end: number, isWhite: 0 | 1): Array;
+ protected _toCounters(start: number, counters: Uint16Array): Uint16Array;
+ }
+}
+declare module "reader/code-128-reader" {
+ import { Barcode, BarcodeCorrection, BarcodeInfo, BarcodeReader } from "reader/barcode-reader";
+ export class Code128Reader extends BarcodeReader {
+ constructor();
+ protected _decodeCode(start: number, correction: BarcodeCorrection): BarcodeInfo;
+ private _correct;
+ protected _findStart(): {
+ error: number;
+ code: number;
+ start: number;
+ end: number;
+ correction: {
+ bar: number;
+ space: number;
+ };
+ };
+ decode(): Barcode;
+ protected _verifyTrailingWhitespace(endInfo: BarcodeInfo): BarcodeInfo;
+ private _calculateCorrection;
+ }
+}
+declare module "reader/code-39-reader" {
+ import { Barcode, BarcodeInfo, BarcodeReader } from "reader/barcode-reader";
+ export class Code39Reader extends BarcodeReader {
+ constructor();
+ decode(): Barcode;
+ protected _patternToChar(pattern: any): string;
+ private _verifyTrailingWhitespace;
+ private _findNextWidth;
+ private _toPattern;
+ protected _findStart(): BarcodeInfo;
+ }
+}
+declare module "reader/code-39-vin-reader" {
+ import { Barcode } from "reader/barcode-reader";
+ import { Code39Reader } from "reader/code-39-reader";
+ export class Code39VINReader extends Code39Reader {
+ constructor();
+ /**
+ * @borrows
+ * https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
+ */
+ decode(): Barcode;
+ private _checkChecksum;
+ }
+}
+declare module "reader/codabar-reader" {
+ import { Barcode, BarcodeInfo, BarcodeReader } from "reader/barcode-reader";
+ export class CodabarReader extends BarcodeReader {
+ private _counters;
+ constructor();
+ decode(): Barcode;
+ protected _verifyWhitespace(startCounter: number, endCounter: number): boolean;
+ private _calculatePatternLength;
+ private _thresholdResultPattern;
+ private _charToPattern;
+ private _validateResult;
+ private _patternToChar;
+ private _computeAlternatingThreshold;
+ private _toPattern;
+ private _sumCounters;
+ protected _findStart(): BarcodeInfo;
+ }
+}
+declare module "common/merge" {
+ /**
+ * Performs a deep merge of objects and returns new object.
+ * Does not modify objects (immutable).
+ * @see https://stackoverflow.com/a/48218209
+ *
+ * @param objects - Objects to merge
+ * @returns New object with merged key/values
+ */
+ export function merge(...objects: ReadonlyArray): object;
+}
+declare module "reader/ean-reader" {
+ import { Barcode, BarcodeInfo, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ export class EANReader extends BarcodeReader {
+ readonly CODE_L_START: number;
+ readonly CODE_G_START: number;
+ readonly START_PATTERN: Array;
+ readonly STOP_PATTERN: Array;
+ readonly MIDDLE_PATTERN: Array;
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ protected _decodeCode(start: number, coderange?: number): BarcodeInfo;
+ protected _findStart(): BarcodeInfo;
+ protected _verifyTrailingWhitespace(endInfo: BarcodeInfo): BarcodeInfo;
+ protected _findEnd(offset: number, isWhite: 0 | 1): BarcodeInfo;
+ private _calculateFirstDigit;
+ protected _decodePayload(code: BarcodeInfo, result: Array, decodedCodes: Array): BarcodeInfo;
+ decode(): Barcode;
+ private _decodeExtensions;
+ protected _checksum(result: Array): boolean;
+ }
+}
+declare module "reader/ean-8-reader" {
+ import { BarcodeInfo, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ import { EANReader } from "reader/ean-reader";
+ export class EAN8Reader extends EANReader {
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ protected _decodePayload(code: BarcodeInfo, result: Array, decodedCodes: Array): BarcodeInfo;
+ }
+}
+declare module "reader/ean-2-reader" {
+ import { Barcode, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ import { EANReader } from "reader/ean-reader";
+ export class EAN2Reader extends EANReader {
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ decode(row?: Array, start?: number): Barcode;
+ }
+}
+declare module "reader/ean-5-reader" {
+ import { Barcode, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ import { EANReader } from "reader/ean-reader";
+ export class EAN5Reader extends EANReader {
+ readonly CHECK_DIGIT_ENCODINGS: Array;
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ decode(row?: Array, start?: number): Barcode;
+ private _determineCheckDigit;
+ private _extensionChecksum;
+ }
+}
+declare module "reader/upc-reader" {
+ import { Barcode, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ import { EANReader } from "reader/ean-reader";
+ export class UPCReader extends EANReader {
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ decode(): Barcode;
+ }
+}
+declare module "reader/upc-e-reader" {
+ import { BarcodeInfo, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ import { EANReader } from "reader/ean-reader";
+ export class UPCEReader extends EANReader {
+ readonly STOP_PATTERN: number[];
+ constructor(config?: BarcodeReaderConfig, supplements?: Array);
+ protected _decodePayload(code: BarcodeInfo, result: Array, decodedCodes: Array): BarcodeInfo;
+ private _determineParity;
+ private _convertToUPCA;
+ protected _checksum(result: Array): boolean;
+ protected _findEnd(offset: number, isWhite: 0 | 1): BarcodeInfo;
+ protected _verifyTrailingWhitespace(endInfo: BarcodeInfo): BarcodeInfo;
+ }
+}
+declare module "reader/i2of5-reader" {
+ import { Barcode, BarcodeInfo, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ export class I2of5Reader extends BarcodeReader {
+ private _barSpaceRatio;
+ constructor(config?: BarcodeReaderConfig);
+ decode(): Barcode;
+ protected _matchPattern(counter: Array, code: ReadonlyArray): number;
+ protected _findStart(): BarcodeInfo;
+ protected _verifyTrailingWhitespace(endInfo: BarcodeInfo): BarcodeInfo;
+ protected _findEnd(): BarcodeInfo;
+ protected _decodeCode(counter: Array): BarcodeInfo;
+ protected _decodePayload(counters: ReadonlyArray, result: Array, decodedCodes: Array): [BarcodeInfo, BarcodeInfo];
+ }
+}
+declare module "reader/2of5-reader" {
+ import { Barcode, BarcodeInfo, BarcodeReader, BarcodeReaderConfig } from "reader/barcode-reader";
+ export class TwoOfFiveReader extends BarcodeReader {
+ private _barSpaceRatio;
+ constructor(config?: BarcodeReaderConfig);
+ decode(): Barcode;
+ protected _findStart(): BarcodeInfo;
+ protected _verifyTrailingWhitespace(endInfo: BarcodeInfo): BarcodeInfo;
+ protected _findEnd(): BarcodeInfo;
+ protected _decodeCode(counter: ReadonlyArray): BarcodeInfo;
+ protected _decodePayload(counters: ReadonlyArray, result: Array, decodedCodes: Array): BarcodeInfo;
+ }
+}
+declare module "reader/code-93-reader" {
+ import { Barcode, BarcodeReader } from "reader/barcode-reader";
+ export class Code93Reader extends BarcodeReader {
+ constructor();
+ decode(): Barcode;
+ protected _patternToChar(pattern: number): string;
+ private _verifyEnd;
+ private _toPattern;
+ private _findStart;
+ private _decodeExtended;
+ private _verifyChecksums;
+ private _matchCheckChar;
+ }
+}
+declare module "reader/index" {
+ import { Code128Reader } from "reader/code-128-reader";
+ import { Code39Reader } from "reader/code-39-reader";
+ import { Code39VINReader } from "reader/code-39-vin-reader";
+ import { CodabarReader } from "reader/codabar-reader";
+ import { EANReader } from "reader/ean-reader";
+ import { EAN8Reader } from "reader/ean-8-reader";
+ import { EAN2Reader } from "reader/ean-2-reader";
+ import { EAN5Reader } from "reader/ean-5-reader";
+ import { UPCReader } from "reader/upc-reader";
+ import { UPCEReader } from "reader/upc-e-reader";
+ import { I2of5Reader } from "reader/i2of5-reader";
+ import { TwoOfFiveReader } from "reader/2of5-reader";
+ import { Code93Reader } from "reader/code-93-reader";
+ export const Readers: {
+ code_128_reader: typeof Code128Reader;
+ ean_reader: typeof EANReader;
+ ean_5_reader: typeof EAN5Reader;
+ ean_2_reader: typeof EAN2Reader;
+ ean_8_reader: typeof EAN8Reader;
+ code_39_reader: typeof Code39Reader;
+ code_39_vin_reader: typeof Code39VINReader;
+ codabar_reader: typeof CodabarReader;
+ upc_reader: typeof UPCReader;
+ upc_e_reader: typeof UPCEReader;
+ i2of5_reader: typeof I2of5Reader;
+ '2of5_reader': typeof TwoOfFiveReader;
+ code_93_reader: typeof Code93Reader;
+ };
+}
+declare module "decoder/bresenham" {
+ import { Point } from "common/point";
+ import { ImageWrapper } from "common/image-wrapper";
+ export interface BarcodeLine {
+ line: Array;
+ max?: number;
+ min?: number;
+ threshold?: number;
+ }
+ export const Bresenham: {
+ /**
+ * Scans a line of the given image from point p1 to p2 and returns a result object containing
+ * gray-scale values (0-255) of the underlying pixels in addition to the min and max values.
+ * @param imageWrapper
+ * @param p1 The start point {x,y}
+ * @param p2 The end point {x,y}
+ * @returns {line, min, max}
+ */
+ getBarcodeLine(imageWrapper: ImageWrapper, p1: Point, p2: Point): BarcodeLine;
+ /**
+ * Converts the result from getBarcodeLine into a binary representation
+ * also considering the frequency and slope of the signal for more robust results
+ * @param result {line, min, max}
+ */
+ toBinaryLine(result: BarcodeLine): BarcodeLine;
+ };
+}
+declare module "decoder/barcode-decoder" {
+ import { Box } from "common/box";
+ import { ImageWrapper } from "common/image-wrapper";
+ import { Point } from "common/point";
+ import { Barcode, BarcodeReaderDeclaration } from "reader/barcode-reader";
+ export interface BarcodeDecoderConfig {
+ debug?: {
+ drawBoundingBox?: boolean;
+ drawScanline?: boolean;
+ showFrequency?: boolean;
+ showPattern?: boolean;
+ };
+ multiple?: boolean;
+ readers?: Array;
+ }
+ type Line = [Point, Point];
+ export interface QuaggaBarcode {
+ angle?: number;
+ barcodes?: Array;
+ box?: Box;
+ boxes?: Array;
+ codeResult?: Barcode;
+ frame?: string;
+ line?: Line;
+ pattern?: Array;
+ threshold?: number;
+ }
+ export class BarcodeDecoder {
+ private _config;
+ private _inputImageWrapper;
+ private _frequencyCanvas;
+ private _patternCanvas;
+ private _overlayContext;
+ private _barcodeReaders;
+ constructor(config: BarcodeDecoderConfig, inputImageWrapper: ImageWrapper);
+ decodeFromBoundingBoxes(boxes: Array): QuaggaBarcode;
+ /**
+ * With the help of the configured readers this function tries to detect
+ * a valid barcode pattern within the given area.
+ * @param box The area to search in
+ * @returns The result {codeResult, line, angle, pattern, threshold}
+ */
+ decodeFromBoundingBox(box: Box): QuaggaBarcode;
+ setReaders(readers: Array): void;
+ private _initReaders;
+ /**
+ * extend the line on both ends
+ * @param line
+ * @param angle
+ */
+ private _getExtendedLine;
+ private _getLine;
+ private _tryDecode;
+ /**
+ * This method slices the given area apart and tries to detect a barcode-pattern for each slice.
+ * It returns the decoded barcode, or null if nothing was found
+ * @param box
+ * @param line
+ * @param lineAngle
+ */
+ private _tryDecodeBruteForce;
+ /**
+ * Used for development only
+ */
+ private _printFrequency;
+ /**
+ * Used for development only
+ */
+ private _printPattern;
+ private _drawPath;
+ }
+}
+declare module "analytics/result-collector" {
+ import { QuaggaBarcode } from "decoder/barcode-decoder";
+ import { Barcode } from "reader/barcode-reader";
+ export interface ResultCollectorConfig {
+ capacity?: number;
+ capture?: boolean;
+ blacklist?: Array;
+ filter?: (item: Barcode) => boolean;
+ }
+ export class ResultCollector {
+ private _canvas;
+ private _context;
+ private _config;
+ private _capacity;
+ private _capture;
+ private _results;
+ constructor(config: ResultCollectorConfig);
+ addResult(data: Uint8Array, imageWidth: number, imageHeight: number, codeResult: Barcode): void;
+ getResults(): Array;
+ private _contains;
+ private _passesFilter;
+ }
+}
+declare module "common/events" {
+ export interface EventCallback {
+ (data: any): void;
+ }
+ export interface EventSubscription {
+ callback: EventCallback;
+ async?: boolean;
+ once?: boolean;
+ }
+ export class Events {
+ static subscribe(event: string, callback: EventSubscription | EventCallback, async?: boolean): void;
+ static publish(type: string, data?: any): void;
+ static once(event: string, callback: EventCallback, async?: boolean): void;
+ static unsubscribe(eventName?: string, callback?: EventCallback): void;
+ }
+}
+declare module "locator/barcode-locator-config" {
+ export type PatchSizeConfig = number | 'x-small' | 'small' | 'medium' | 'large' | 'x-large';
+ export interface BarcodeLocatorDebugConfig {
+ /**
+ * @default false
+ */
+ showCanvas?: boolean;
+ /**
+ * @default false
+ */
+ showPatches?: boolean;
+ /**
+ * @default false
+ */
+ showFoundPatches?: boolean;
+ /**
+ * @default false
+ */
+ showSkeleton?: boolean;
+ /**
+ * @default false
+ */
+ showLabels?: boolean;
+ /**
+ * @default false
+ */
+ showPatchLabels?: boolean;
+ /**
+ * @default false
+ */
+ showRemainingPatchLabels?: boolean;
+ boxFromPatches?: {
+ /**
+ * @default false
+ */
+ showTransformed?: boolean;
+ /**
+ * @default false
+ */
+ showTransformedBox?: boolean;
+ /**
+ * @default false
+ */
+ showBB?: boolean;
+ };
+ }
+ export interface BarcodeLocatorConfig {
+ debug?: BarcodeLocatorDebugConfig;
+ /**
+ * @default true
+ */
+ halfSample?: boolean;
+ /**
+ * @default 'medium'
+ */
+ patchSize?: PatchSizeConfig;
+ useWorker?: boolean;
+ }
+}
+declare module "input/input-stream-config" {
+ type InputStreamType = 'ImageStream' | 'LiveStream' | 'VideoStream';
+ export interface AreaConfig {
+ bottom?: string;
+ left?: string;
+ right?: string;
+ top?: string;
+ }
+ export interface InputStreamConfig {
+ area?: AreaConfig;
+ constraints?: MediaTrackConstraints;
+ halfSample?: boolean;
+ length?: number;
+ mime?: string;
+ name?: string;
+ sequence?: boolean;
+ singleChannel?: boolean;
+ size?: number;
+ src?: string;
+ target?: HTMLElement | string;
+ type?: InputStreamType;
+ }
+}
+declare module "config/config" {
+ import { BarcodeDecoderConfig } from "decoder/barcode-decoder";
+ import { BarcodeLocatorConfig } from "locator/barcode-locator-config";
+ import { InputStreamConfig } from "input/input-stream-config";
+ interface DebugConfig {
+ }
+ export interface QuaggaConfig {
+ debug?: DebugConfig;
+ decoder?: BarcodeDecoderConfig;
+ frequency?: number;
+ inputStream?: InputStreamConfig;
+ locate?: boolean;
+ locator?: BarcodeLocatorConfig;
+ numOfWorkers?: number;
+ src?: string;
+ }
+ export const config: QuaggaConfig;
+}
+declare module "common/media-devices" {
+ export function enumerateDevices(): Promise>;
+ export function getUserMedia(constraints: MediaStreamConstraints): Promise;
+}
+declare module "input/camera-access" {
+ export const CameraAccess: {
+ /**
+ * Attempts to attach the camera-stream to a given video element
+ * and calls the callback function when the content is ready
+ * @param video
+ * @param videoConstraints
+ */
+ request(video: HTMLVideoElement, videoConstraints: MediaTrackConstraints): Promise;
+ release(): void;
+ enumerateVideoDevices(): Promise;
+ getActiveStreamLabel(): string;
+ getActiveTrack(): MediaStreamTrack;
+ pickConstraints(videoConstraints: MediaTrackConstraints): MediaStreamConstraints;
+ };
+}
+declare module "input/exif-helper" {
+ export const AvailableTags: Array;
+ export interface Tags {
+ [key: string]: number | string;
+ }
+ export function findTagsInObjectURL(src: string, tags?: string[]): Promise;
+ export function findTagsInBuffer(file: ArrayBuffer, selectedTags?: Array): Tags;
+}
+declare module "input/image-loader" {
+ import { Tags } from "input/exif-helper";
+ export interface ImageInfo {
+ image: HTMLImageElement;
+ tags?: Tags;
+ }
+ export class ImageLoader {
+ static load(baseUri: string, callback: (_: Array) => void, offset: number, size: number, sequence: boolean): Promise;
+ }
+}
+declare module "input/input-stream" {
+ import { Point } from "common/point";
+ import { ImageInfo } from "input/image-loader";
+ import { InputStreamConfig } from "input/input-stream-config";
+ export abstract class InputStream {
+ protected _calculatedHeight: number;
+ protected _calculatedWidth: number;
+ protected _canvasHeight: number;
+ protected _canvasWidth: number;
+ protected _config: InputStreamConfig;
+ protected _eventNames: Array;
+ protected _eventHandlers: Map>;
+ protected _topLeft: Point;
+ constructor();
+ abstract readonly realHeight: number;
+ abstract readonly realWidth: number;
+ height: number;
+ width: number;
+ topLeft: Point;
+ setCanvasSize(width: number, height: number): void;
+ readonly canvasHeight: number;
+ readonly canvasWidth: number;
+ abstract config: InputStreamConfig;
+ abstract readonly ended: boolean;
+ abstract setAttribute(name: string, value: string): void;
+ abstract pause(): void;
+ abstract play(): void;
+ abstract currentTime: number;
+ addEventListener(event: string, listener: EventListener, _options?: boolean): void;
+ clearEventHandlers(): void;
+ trigger(eventName: string, argArray?: any): void;
+ abstract getFrame(): HTMLVideoElement | ImageInfo;
+ }
+}
+declare module "input/frame-grabber" {
+ import { InputStream } from "input/input-stream";
+ export class FrameGrabber {
+ private _inputStream;
+ private _streamConfig;
+ private _canvas;
+ private _context;
+ private _data;
+ private _canvasHeight;
+ private _canvasWidth;
+ private _height;
+ private _width;
+ private _topLeft;
+ constructor(inputStream: InputStream, canvas: HTMLCanvasElement);
+ /**
+ * Fetches a frame from the input stream and puts into the frame buffer.
+ * The image data is converted to gray scale and then half-sampled if configured.
+ */
+ grab(data: Uint8Array): boolean;
+ private _adjustCanvasSize;
+ private _grayAndHalfSampleFromCanvasData;
+ private _computeGray;
+ }
+}
+declare module "input/image-stream" {
+ import { ImageInfo } from "input/image-loader";
+ import { InputStream } from "input/input-stream";
+ import { InputStreamConfig } from "input/input-stream-config";
+ export class ImageStream extends InputStream {
+ private _baseUrl;
+ private _ended;
+ private _frameIndex;
+ private _height;
+ private _images;
+ private _loaded;
+ private _offset;
+ private _paused;
+ private _size;
+ private _width;
+ constructor();
+ readonly realHeight: number;
+ readonly realWidth: number;
+ config: InputStreamConfig;
+ readonly ended: boolean;
+ setAttribute(): void;
+ pause(): void;
+ play(): void;
+ currentTime: number;
+ getFrame(): HTMLVideoElement | ImageInfo;
+ private _loadImages;
+ }
+}
+declare module "input/video-stream" {
+ import { ImageInfo } from "input/image-loader";
+ import { InputStream } from "input/input-stream";
+ import { InputStreamConfig } from "input/input-stream-config";
+ export class VideoStream extends InputStream {
+ private _video;
+ constructor(video: HTMLVideoElement);
+ readonly realHeight: number;
+ readonly realWidth: number;
+ config: InputStreamConfig;
+ readonly ended: boolean;
+ setAttribute(name: string, value: string): void;
+ pause(): void;
+ play(): void;
+ currentTime: number;
+ addEventListener(event: string, listener: EventListener, options?: boolean): void;
+ clearEventHandlers(): void;
+ trigger(eventName: string, argArray?: any): void;
+ getFrame(): HTMLVideoElement | ImageInfo;
+ private _initSize;
+ }
+ export class LiveStream extends VideoStream {
+ constructor(video: HTMLVideoElement);
+ readonly ended: boolean;
+ }
+}
+declare module "input/live-stream" {
+ import { VideoStream } from "input/video-stream";
+ export class LiveStream extends VideoStream {
+ constructor(video: HTMLVideoElement);
+ readonly ended: boolean;
+ }
+}
+declare module "input/input-stream-utils" {
+ import { Point } from "common/point";
+ import { BarcodeLocatorConfig, PatchSizeConfig } from "locator/barcode-locator-config";
+ import { InputStream } from "input/input-stream";
+ import { AreaConfig } from "input/input-stream-config";
+ export interface Dimension {
+ unit: '%' | 'px';
+ value: number;
+ }
+ export function calculatePatchSize(patchSize: PatchSizeConfig, { x, y }: Point): Point;
+ export function checkImageConstraints(inputStream: InputStream, config: BarcodeLocatorConfig): boolean;
+ export function _parseCssDimensionValues(value: string): Dimension;
+ export const _dimensionsConverters: {
+ bottom: (dimension: Dimension, { height }: {
+ height: any;
+ }) => any;
+ left: (dimension: Dimension, { width }: {
+ width: any;
+ }) => number;
+ right: (dimension: Dimension, { width }: {
+ width: any;
+ }) => any;
+ top: (dimension: Dimension, { height }: {
+ height: any;
+ }) => number;
+ };
+ export function computeImageArea(inputWidth: number, inputHeight: number, area: AreaConfig): {
+ topLeft: {
+ x: number;
+ y: number;
+ };
+ width: number;
+ height: number;
+ };
+}
+declare module "common/cluster" {
+ import { Moment } from "common/moment";
+ /**
+ * Creates a cluster for grouping similar orientations of moments
+ */
+ export class Cluster {
+ private _threshold;
+ private _moments;
+ private _center;
+ static clusterize(moments: Array, threshold: number): Array;
+ constructor(threshold: number, moment: Moment);
+ add(point: Moment): void;
+ fits(moment: Moment): boolean;
+ readonly moments: Moment[];
+ }
+}
+declare module "locator/barcode-locator-utils" {
+ import { ImageWrapper } from "common/image-wrapper";
+ import { Point } from "common/point";
+ /**
+ * Invert matrix
+ * @param matrix the matrix to invert
+ * @returns the inverted matrix
+ */
+ export function invert(matrix: Float32Array): Float32Array;
+ /**
+ * Transforms the vector with a matrix
+ * @param { x, y } vector to transform
+ * @param matrix matrix to transform with
+ * @returns the transformed vector
+ */
+ export function transformWithMatrix({ x, y }: Point, matrix: Float32Array): Point;
+ export function otsuThreshold(imageWrapper: ImageWrapper, targetWrapper: ImageWrapper): number;
+ /**
+ * @param imageWrapper input image to be sampled
+ * @param outImageWrapper {ImageWrapper} to be stored in
+ */
+ export function halfSample(imageWrapper: ImageWrapper, outImageWrapper: ImageWrapper): void;
+}
+declare module "locator/tracer" {
+ import { ImageWrapper } from "common/image-wrapper";
+ /**
+ * @borrows http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
+ */
+ type Direction = number;
+ export const SearchDirections: Array>;
+ export interface ContourVertex {
+ x: number;
+ y: number;
+ dir: Direction;
+ next: ContourVertex;
+ prev: ContourVertex;
+ }
+ interface Current {
+ cx: number;
+ cy: number;
+ dir: Direction;
+ }
+ export class Tracer {
+ private _imageData;
+ private _labelData;
+ private _width;
+ constructor(imageWrapper: ImageWrapper, labelWrapper: ImageWrapper>);
+ trace(current: Current, color: number, label: number, edgeLabel: number): boolean;
+ contourTracing(sy: number, sx: number, label: number, color: number, edgeLabel: number): ContourVertex;
+ }
+}
+declare module "locator/rasterizer" {
+ /**
+ * @borrows http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
+ */
+ import { ImageWrapper } from "common/image-wrapper";
+ import { ContourVertex } from "locator/tracer";
+ enum ContourDirection {
+ CW = 0,
+ CCW = 1,
+ Unknown = 2
+ }
+ interface Contour {
+ dir: ContourDirection;
+ index: number;
+ firstVertex: ContourVertex;
+ previousPeer?: Contour;
+ nextPeer?: Contour;
+ insideContours: Contour;
+ }
+ export interface RasterResult {
+ cc: Contour;
+ count: number;
+ }
+ export class Rasterizer {
+ private _width;
+ private _height;
+ private _tracer;
+ private _imageData;
+ private _labelData;
+ constructor(imageWrapper: ImageWrapper, labelWrapper: ImageWrapper>);
+ rasterize(depthLabel: number): RasterResult;
+ drawContour(canvas: HTMLCanvasElement, firstContour: Contour): void;
+ }
+}
+declare module "locator/barcode-locator" {
+ import { ImageWrapper } from "common/image-wrapper";
+ import { Point } from "common/point";
+ import { BarcodeLocatorConfig } from "locator/barcode-locator-config";
+ export class BarcodeLocator {
+ private _config;
+ private _inputImageWrapper;
+ private _currentImageWrapper;
+ private _skelImageWrapper;
+ private _subImageWrapper;
+ private _labelImageWrapper;
+ private _binaryImageWrapper;
+ private _patchGrid;
+ private _patchLabelGrid;
+ private _imageToPatchGrid;
+ private _patchSize;
+ private _binaryContext;
+ private _numPatches;
+ private _skeletonizer;
+ constructor(inputImageWrapper: ImageWrapper, config: BarcodeLocatorConfig);
+ locate(): [Point, Point, Point, Point][];
+ private _initBuffers;
+ private _initCanvas;
+ /**
+ * Creates a bounding box which encloses all the given patches
+ * @returns The minimal bounding box
+ */
+ private _boxFromPatches;
+ /**
+ * Creates a binary image of the current image
+ */
+ private _binarizeImage;
+ /**
+ * Iterate over the entire image, extract patches
+ */
+ private _findPatches;
+ /**
+ * Finds those connected areas which contain at least 6 patches
+ * and returns them ordered DESC by the number of contained patches
+ * @param maxLabel
+ */
+ private _findBiggestConnectedAreas;
+ /**
+ *
+ */
+ private _findBoxes;
+ /**
+ * Find similar moments (via cluster)
+ * @param moments
+ */
+ private _similarMoments;
+ private _skeletonize;
+ /**
+ * Extracts and describes those patches which seem to contain a barcode pattern
+ * @param moments
+ * @param index
+ * @param x
+ * @param y
+ * @returns list of patches
+ */
+ private _describePatch;
+ private _notYetProcessed;
+ private _trace;
+ /**
+ * Finds patches which are connected and share the same orientation
+ * @param patchesFound
+ */
+ private _rasterizeAngularSimilarity;
+ private _drawRect;
+ private _drawPath;
+ }
+}
+declare module "quagga" {
+ import { ResultCollector } from "analytics/result-collector";
+ import { EventCallback, EventSubscription } from "common/events";
+ import { ImageWrapper } from "common/image-wrapper";
+ import { Point } from "common/point";
+ import { QuaggaConfig } from "config/config";
+ import { QuaggaBarcode } from "decoder/barcode-decoder";
+ import { BarcodeReaderDeclaration } from "reader/barcode-reader";
+ export interface QuaggaCanvasContainer {
+ ctx: {
+ image: CanvasRenderingContext2D;
+ overlay: CanvasRenderingContext2D;
+ };
+ dom: {
+ image: HTMLCanvasElement;
+ overlay: HTMLCanvasElement;
+ };
+ }
+ const _default_1: {
+ init(config: QuaggaConfig, cb: () => void, imageWrapper?: ImageWrapper): void;
+ CameraAccess: {
+ request(video: HTMLVideoElement, videoConstraints: MediaTrackConstraints): Promise;
+ release(): void;
+ enumerateVideoDevices(): Promise;
+ getActiveStreamLabel(): string;
+ getActiveTrack(): MediaStreamTrack;
+ pickConstraints(videoConstraints: MediaTrackConstraints): MediaStreamConstraints;
+ };
+ ImageDebug: {
+ drawPath(path: Point[], context: CanvasRenderingContext2D, color: string, lineWidth: number): void;
+ drawImage(imageData: Uint8Array, width: number, height: number, context: CanvasRenderingContext2D): boolean;
+ };
+ ImageWrapper: typeof ImageWrapper;
+ ResultCollector: typeof ResultCollector;
+ readonly canvas: QuaggaCanvasContainer;
+ start(): void;
+ stop(): void;
+ decodeSingle(config: QuaggaConfig, resultCallback: (_: QuaggaBarcode) => void): void;
+ pause(): void;
+ onDetected(callback: EventCallback | EventSubscription): void;
+ offDetected(callback: EventCallback): void;
+ onProcessed(callback: EventCallback | EventSubscription): void;
+ offProcessed(callback: EventCallback): void;
+ setReaders(readers: BarcodeReaderDeclaration[]): void;
+ registerResultCollector(resultCollector: ResultCollector): void;
+ };
+ export default _default_1;
+}
+declare module "config/config.dev" {
+ import { QuaggaConfig } from "config/config";
+ export const config: QuaggaConfig;
+}
+declare module "config/config.node" {
+ import { QuaggaConfig } from "config/config";
+ export const config: QuaggaConfig;
+}
+declare module "input/frame-grabber.node" {
+ import { InputStream } from "input/input-stream";
+ export class FrameGrabber {
+ private _inputStream;
+ private _streamConfig;
+ private _data;
+ private _canvasData;
+ private _grayData;
+ private _canvasImageArray;
+ private _grayImageArray;
+ private _targetImageArray;
+ private _canvasHeight;
+ private _canvasWidth;
+ private _videoHeight;
+ private _videoWidth;
+ private _height;
+ private _width;
+ private _stepSizeX;
+ private _stepSizeY;
+ private _topLeft;
+ constructor(inputStream: InputStream);
+ /**
+ * Fetches a frame from the input stream and puts into the frame buffer.
+ * The image data is converted to gray scale and then half-sampled if configured.
+ */
+ grab(data: Uint8Array): boolean;
+ private _scaleAndCrop;
+ private _computeGray;
+ }
+}
+declare module "input/image-stream.node" {
+ import { ImageInfo } from "input/image-loader";
+ import { InputStream } from "input/input-stream";
+ import { InputStreamConfig } from "input/input-stream-config";
+ export class ImageStream extends InputStream {
+ private _baseUrl;
+ private _ended;
+ private _frame;
+ private _height;
+ private _loaded;
+ private _offset;
+ private _size;
+ private _width;
+ constructor();
+ readonly realHeight: number;
+ readonly realWidth: number;
+ config: InputStreamConfig;
+ readonly ended: boolean;
+ setAttribute(): void;
+ pause(): void;
+ play(): void;
+ currentTime: number;
+ getFrame(): HTMLVideoElement | ImageInfo;
+ private _loadImages;
+ }
+}
diff --git a/dist/quagga.js b/dist/quagga.js
index a99b4289..9a2a682d 100644
--- a/dist/quagga.js
+++ b/dist/quagga.js
@@ -1,12 +1,15 @@
+var Quagga =
+
(function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory(factory.toString()).default;
- else if(typeof exports === 'object')
- exports["Quagga"] = factory(factory.toString()).default;
- else
- root["Quagga"] = factory(factory.toString()).default;
+ if (typeof exports === 'object' && typeof module === 'object') {
+ module.exports = factory(factory.toString()).default;
+ } else if (typeof exports === 'object') {
+ exports["Quagga"] = factory(factory.toString()).default;
+ } else {
+ root["Quagga"] = factory(factory.toString()).default;
+ }
})(this, function(__factorySource__) {
-return /******/ (function(modules) { // webpackBootstrap
+ return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
@@ -14,9 +17,9 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId])
+/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
-/******/
+/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
@@ -41,18 +44,35 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
-/******/ // identity function for calling harmony imports with the correct context
-/******/ __webpack_require__.i = function(value) { return value; };
-/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
-/******/ Object.defineProperty(exports, name, {
-/******/ configurable: false,
-/******/ enumerable: true,
-/******/ get: getter
-/******/ });
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
@@ -70,11514 +90,9261 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
+/******/
/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 166);
+/******/ return __webpack_require__(__webpack_require__.s = "./src/quagga.ts");
/******/ })
/************************************************************************/
-/******/ ([
-/* 0 */
+/******/ ({
+
+/***/ "../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js":
+/*!***********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
+ \***********************************************************************************/
+/*! no static exports found */
/***/ (function(module, exports) {
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return value != null && (type == 'object' || type == 'function');
+function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
+ arr2[i] = arr[i];
+ }
+
+ return arr2;
+ }
}
-module.exports = isObject;
+module.exports = _arrayWithoutHoles;
+
+/***/ }),
+
+/***/ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js":
+/*!***************************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/assertThisInitialized.js ***!
+ \***************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+}
+module.exports = _assertThisInitialized;
/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__common_array_helper__ = __webpack_require__(3);
+/***/ "../../node_modules/@babel/runtime/helpers/asyncToGenerator.js":
+/*!**********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
+ \**********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
-function BarcodeReader(config, supplements) {
- this._row = [];
- this.config = config || {};
- this.supplements = supplements;
- return this;
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
}
-BarcodeReader.prototype._nextUnset = function (line, start) {
- var i;
+function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
- if (start === undefined) {
- start = 0;
- }
- for (i = start; i < line.length; i++) {
- if (!line[i]) {
- return i;
- }
- }
- return line.length;
-};
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
-BarcodeReader.prototype._matchPattern = function (counter, code, maxSingleError) {
- var i,
- error = 0,
- singleError = 0,
- sum = 0,
- modulo = 0,
- barWidth,
- count,
- scaled;
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
- maxSingleError = maxSingleError || this.SINGLE_CODE_ERROR || 1;
+ _next(undefined);
+ });
+ };
+}
- for (i = 0; i < counter.length; i++) {
- sum += counter[i];
- modulo += code[i];
- }
- if (sum < modulo) {
- return Number.MAX_VALUE;
- }
- barWidth = sum / modulo;
- maxSingleError *= barWidth;
+module.exports = _asyncToGenerator;
- for (i = 0; i < counter.length; i++) {
- count = counter[i];
- scaled = code[i] * barWidth;
- singleError = Math.abs(count - scaled) / scaled;
- if (singleError > maxSingleError) {
- return Number.MAX_VALUE;
- }
- error += singleError;
- }
- return error / modulo;
-};
+/***/ }),
-BarcodeReader.prototype._nextSet = function (line, offset) {
- var i;
+/***/ "../../node_modules/@babel/runtime/helpers/classCallCheck.js":
+/*!********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/classCallCheck.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
- offset = offset || 0;
- for (i = offset; i < line.length; i++) {
- if (line[i]) {
- return i;
- }
- }
- return line.length;
-};
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+}
-BarcodeReader.prototype._correctBars = function (counter, correction, indices) {
- var length = indices.length,
- tmp = 0;
- while (length--) {
- tmp = counter[indices[length]] * (1 - (1 - correction) / 2);
- if (tmp > 1) {
- counter[indices[length]] = tmp;
- }
- }
-};
+module.exports = _classCallCheck;
-BarcodeReader.prototype._matchTrace = function (cmpCounter, epsilon) {
- var counter = [],
- i,
- self = this,
- offset = self._nextSet(self._row),
- isWhite = !self._row[offset],
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0
- },
- error;
+/***/ }),
- if (cmpCounter) {
- for (i = 0; i < cmpCounter.length; i++) {
- counter.push(0);
- }
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- error = self._matchPattern(counter, cmpCounter);
-
- if (error < epsilon) {
- bestMatch.start = i - offset;
- bestMatch.end = i;
- bestMatch.counter = counter;
- return bestMatch;
- } else {
- return null;
- }
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- } else {
- counter.push(0);
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- counterPos++;
- counter.push(0);
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- }
+/***/ "../../node_modules/@babel/runtime/helpers/createClass.js":
+/*!*****************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/createClass.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
- // if cmpCounter was not given
- bestMatch.start = offset;
- bestMatch.end = self._row.length - 1;
- bestMatch.counter = counter;
- return bestMatch;
-};
+function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+}
-BarcodeReader.prototype.decodePattern = function (pattern) {
- var self = this,
- result;
+function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+}
- self._row = pattern;
- result = self._decode();
- if (result === null) {
- self._row.reverse();
- result = self._decode();
- if (result) {
- result.direction = BarcodeReader.DIRECTION.REVERSE;
- result.start = self._row.length - result.start;
- result.end = self._row.length - result.end;
- }
- } else {
- result.direction = BarcodeReader.DIRECTION.FORWARD;
- }
- if (result) {
- result.format = self.FORMAT;
- }
- return result;
-};
+module.exports = _createClass;
-BarcodeReader.prototype._matchRange = function (start, end, value) {
- var i;
+/***/ }),
- start = start < 0 ? 0 : start;
- for (i = start; i < end; i++) {
- if (this._row[i] !== value) {
- return false;
- }
- }
- return true;
-};
+/***/ "../../node_modules/@babel/runtime/helpers/defineProperty.js":
+/*!********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/defineProperty.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
-BarcodeReader.prototype._fillCounters = function (offset, end, isWhite) {
- var self = this,
- counterPos = 0,
- i,
- counters = [];
-
- isWhite = typeof isWhite !== 'undefined' ? isWhite : true;
- offset = typeof offset !== 'undefined' ? offset : self._nextUnset(self._row);
- end = end || self._row.length;
-
- counters[counterPos] = 0;
- for (i = offset; i < end; i++) {
- if (self._row[i] ^ isWhite) {
- counters[counterPos]++;
- } else {
- counterPos++;
- counters[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return counters;
-};
+function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
-BarcodeReader.prototype._toCounters = function (start, counter) {
- var self = this,
- numCounters = counter.length,
- end = self._row.length,
- isWhite = !self._row[start],
- i,
- counterPos = 0;
+ return obj;
+}
- __WEBPACK_IMPORTED_MODULE_0__common_array_helper__["a" /* default */].init(counter, 0);
+module.exports = _defineProperty;
- for (i = start; i < end; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- counterPos++;
- if (counterPos === numCounters) {
- break;
- } else {
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- }
+/***/ }),
- return counter;
-};
+/***/ "../../node_modules/@babel/runtime/helpers/get.js":
+/*!*********************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/get.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
-Object.defineProperty(BarcodeReader.prototype, "FORMAT", {
- value: 'unknown',
- writeable: false
-});
+var getPrototypeOf = __webpack_require__(/*! ./getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
-BarcodeReader.DIRECTION = {
- FORWARD: 1,
- REVERSE: -1
-};
+var superPropBase = __webpack_require__(/*! ./superPropBase */ "../../node_modules/@babel/runtime/helpers/superPropBase.js");
-BarcodeReader.Exception = {
- StartNotFoundException: "Start-Info was not found!",
- CodeNotFoundException: "Code could not be found!",
- PatternNotFoundException: "Pattern could not be found!"
-};
+function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ module.exports = _get = Reflect.get;
+ } else {
+ module.exports = _get = function _get(target, property, receiver) {
+ var base = superPropBase(target, property);
+ if (!base) return;
+ var desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.get) {
+ return desc.get.call(receiver);
+ }
-BarcodeReader.CONFIG_KEYS = {};
+ return desc.value;
+ };
+ }
+
+ return _get(target, property, receiver || target);
+}
-/* harmony default export */ __webpack_exports__["a"] = BarcodeReader;
+module.exports = _get;
/***/ }),
-/* 2 */
-/***/ (function(module, exports) {
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
-var isArray = Array.isArray;
+/***/ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js":
+/*!********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/getPrototypeOf.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
-module.exports = isArray;
+function _getPrototypeOf(o) {
+ module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+}
+module.exports = _getPrototypeOf;
/***/ }),
-/* 3 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony default export */ __webpack_exports__["a"] = {
- init: function init(arr, val) {
- var l = arr.length;
- while (l--) {
- arr[l] = val;
- }
- },
+/***/ "../../node_modules/@babel/runtime/helpers/inherits.js":
+/*!**************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/inherits.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
- /**
- * Shuffles the content of an array
- * @return {Array} the array itself shuffled
- */
- shuffle: function shuffle(arr) {
- var i = arr.length - 1,
- j,
- x;
- for (i; i >= 0; i--) {
- j = Math.floor(Math.random() * i);
- x = arr[i];
- arr[i] = arr[j];
- arr[j] = x;
- }
- return arr;
- },
+var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "../../node_modules/@babel/runtime/helpers/setPrototypeOf.js");
- toPointList: function toPointList(arr) {
- var i,
- j,
- row = [],
- rows = [];
- for (i = 0; i < arr.length; i++) {
- row = [];
- for (j = 0; j < arr[i].length; j++) {
- row[j] = arr[i][j];
- }
- rows[i] = "[" + row.join(",") + "]";
- }
- return "[" + rows.join(",\r\n") + "]";
- },
+function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
- /**
- * returns the elements which's score is bigger than the threshold
- * @return {Array} the reduced array
- */
- threshold: function threshold(arr, _threshold, scoreFunc) {
- var i,
- queue = [];
- for (i = 0; i < arr.length; i++) {
- if (scoreFunc.apply(arr, [arr[i]]) >= _threshold) {
- queue.push(arr[i]);
- }
- }
- return queue;
- },
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) setPrototypeOf(subClass, superClass);
+}
- maxIndex: function maxIndex(arr) {
- var i,
- max = 0;
- for (i = 0; i < arr.length; i++) {
- if (arr[i] > arr[max]) {
- max = i;
- }
- }
- return max;
- },
+module.exports = _inherits;
- max: function max(arr) {
- var i,
- max = 0;
- for (i = 0; i < arr.length; i++) {
- if (arr[i] > max) {
- max = arr[i];
- }
- }
- return max;
- },
+/***/ }),
- sum: function sum(arr) {
- var length = arr.length,
- sum = 0;
+/***/ "../../node_modules/@babel/runtime/helpers/iterableToArray.js":
+/*!*********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/iterableToArray.js ***!
+ \*********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
- while (length--) {
- sum += arr[length];
- }
- return sum;
- }
-};
+function _iterableToArray(iter) {
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
+}
+
+module.exports = _iterableToArray;
/***/ }),
-/* 4 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge__ = __webpack_require__(28);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_merge__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__barcode_reader__ = __webpack_require__(1);
+/***/ "../../node_modules/@babel/runtime/helpers/nonIterableSpread.js":
+/*!***********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
+ \***********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
+}
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+module.exports = _nonIterableSpread;
+/***/ }),
+/***/ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js":
+/*!*******************************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***!
+ \*******************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+var _typeof = __webpack_require__(/*! ../helpers/typeof */ "../../node_modules/@babel/runtime/helpers/typeof.js");
-function EANReader(opts, supplements) {
- opts = __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default()(getDefaulConfig(), opts);
- __WEBPACK_IMPORTED_MODULE_1__barcode_reader__["a" /* default */].call(this, opts, supplements);
-}
+var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
-function getDefaulConfig() {
- var config = {};
+function _possibleConstructorReturn(self, call) {
+ if (call && (_typeof(call) === "object" || typeof call === "function")) {
+ return call;
+ }
- Object.keys(EANReader.CONFIG_KEYS).forEach(function (key) {
- config[key] = EANReader.CONFIG_KEYS[key].default;
- });
- return config;
+ return assertThisInitialized(self);
}
-var properties = {
- CODE_L_START: { value: 0 },
- CODE_G_START: { value: 10 },
- START_PATTERN: { value: [1, 1, 1] },
- STOP_PATTERN: { value: [1, 1, 1] },
- MIDDLE_PATTERN: { value: [1, 1, 1, 1, 1] },
- EXTENSION_START_PATTERN: { value: [1, 1, 2] },
- CODE_PATTERN: { value: [[3, 2, 1, 1], [2, 2, 2, 1], [2, 1, 2, 2], [1, 4, 1, 1], [1, 1, 3, 2], [1, 2, 3, 1], [1, 1, 1, 4], [1, 3, 1, 2], [1, 2, 1, 3], [3, 1, 1, 2], [1, 1, 2, 3], [1, 2, 2, 2], [2, 2, 1, 2], [1, 1, 4, 1], [2, 3, 1, 1], [1, 3, 2, 1], [4, 1, 1, 1], [2, 1, 3, 1], [3, 1, 2, 1], [2, 1, 1, 3]] },
- CODE_FREQUENCY: { value: [0, 11, 13, 14, 19, 25, 28, 21, 22, 26] },
- SINGLE_CODE_ERROR: { value: 0.70 },
- AVG_CODE_ERROR: { value: 0.48 },
- FORMAT: { value: "ean_13", writeable: false }
-};
+module.exports = _possibleConstructorReturn;
-EANReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_1__barcode_reader__["a" /* default */].prototype, properties);
-EANReader.prototype.constructor = EANReader;
-
-EANReader.prototype._decodeCode = function (start, coderange) {
- var counter = [0, 0, 0, 0],
- i,
- self = this,
- offset = start,
- isWhite = !self._row[offset],
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: start,
- end: start
- },
- code,
- error;
+/***/ }),
- if (!coderange) {
- coderange = self.CODE_PATTERN.length;
- }
+/***/ "../../node_modules/@babel/runtime/helpers/setPrototypeOf.js":
+/*!********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- for (code = 0; code < coderange; code++) {
- error = self._matchPattern(counter, self.CODE_PATTERN[code]);
- if (error < bestMatch.error) {
- bestMatch.code = code;
- bestMatch.error = error;
- }
- }
- bestMatch.end = i;
- if (bestMatch.error > self.AVG_CODE_ERROR) {
- return null;
- }
- return bestMatch;
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
+function _setPrototypeOf(o, p) {
+ module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
-EANReader.prototype._findPattern = function (pattern, offset, isWhite, tryHarder, epsilon) {
- var counter = [],
- self = this,
- i,
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0,
- end: 0
- },
- error,
- j,
- sum;
+ return _setPrototypeOf(o, p);
+}
- if (!offset) {
- offset = self._nextSet(self._row);
- }
+module.exports = _setPrototypeOf;
- if (isWhite === undefined) {
- isWhite = false;
- }
+/***/ }),
- if (tryHarder === undefined) {
- tryHarder = true;
- }
+/***/ "../../node_modules/@babel/runtime/helpers/superPropBase.js":
+/*!*******************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/superPropBase.js ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
- if (epsilon === undefined) {
- epsilon = self.AVG_CODE_ERROR;
- }
+var getPrototypeOf = __webpack_require__(/*! ./getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
- for (i = 0; i < pattern.length; i++) {
- counter[i] = 0;
- }
+function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = getPrototypeOf(object);
+ if (object === null) break;
+ }
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- sum = 0;
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- error = self._matchPattern(counter, pattern);
+ return object;
+}
- if (error < epsilon) {
- bestMatch.error = error;
- bestMatch.start = i - sum;
- bestMatch.end = i;
- return bestMatch;
- }
- if (tryHarder) {
- for (j = 0; j < counter.length - 2; j++) {
- counter[j] = counter[j + 2];
- }
- counter[counter.length - 2] = 0;
- counter[counter.length - 1] = 0;
- counterPos--;
- } else {
- return null;
- }
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
+module.exports = _superPropBase;
-EANReader.prototype._findStart = function () {
- var self = this,
- leadingWhitespaceStart,
- offset = self._nextSet(self._row),
- startInfo;
+/***/ }),
- while (!startInfo) {
- startInfo = self._findPattern(self.START_PATTERN, offset);
- if (!startInfo) {
- return null;
- }
- leadingWhitespaceStart = startInfo.start - (startInfo.end - startInfo.start);
- if (leadingWhitespaceStart >= 0) {
- if (self._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
- return startInfo;
- }
- }
- offset = startInfo.end;
- startInfo = null;
- }
-};
-
-EANReader.prototype._verifyTrailingWhitespace = function (endInfo) {
- var self = this,
- trailingWhitespaceEnd;
-
- trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start);
- if (trailingWhitespaceEnd < self._row.length) {
- if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
- return endInfo;
- }
- }
- return null;
-};
-
-EANReader.prototype._findEnd = function (offset, isWhite) {
- var self = this,
- endInfo = self._findPattern(self.STOP_PATTERN, offset, isWhite, false);
-
- return endInfo !== null ? self._verifyTrailingWhitespace(endInfo) : null;
-};
-
-EANReader.prototype._calculateFirstDigit = function (codeFrequency) {
- var i,
- self = this;
+/***/ "../../node_modules/@babel/runtime/helpers/toConsumableArray.js":
+/*!***********************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
+ \***********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
- for (i = 0; i < self.CODE_FREQUENCY.length; i++) {
- if (codeFrequency === self.CODE_FREQUENCY[i]) {
- return i;
- }
- }
- return null;
-};
+var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js");
-EANReader.prototype._decodePayload = function (code, result, decodedCodes) {
- var i,
- self = this,
- codeFrequency = 0x0,
- firstDigit;
+var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "../../node_modules/@babel/runtime/helpers/iterableToArray.js");
- for (i = 0; i < 6; i++) {
- code = self._decodeCode(code.end);
- if (!code) {
- return null;
- }
- if (code.code >= self.CODE_G_START) {
- code.code = code.code - self.CODE_G_START;
- codeFrequency |= 1 << 5 - i;
- } else {
- codeFrequency |= 0 << 5 - i;
- }
- result.push(code.code);
- decodedCodes.push(code);
- }
+var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "../../node_modules/@babel/runtime/helpers/nonIterableSpread.js");
- firstDigit = self._calculateFirstDigit(codeFrequency);
- if (firstDigit === null) {
- return null;
- }
- result.unshift(firstDigit);
+function _toConsumableArray(arr) {
+ return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
+}
- code = self._findPattern(self.MIDDLE_PATTERN, code.end, true, false);
- if (code === null) {
- return null;
- }
- decodedCodes.push(code);
+module.exports = _toConsumableArray;
- for (i = 0; i < 6; i++) {
- code = self._decodeCode(code.end, self.CODE_G_START);
- if (!code) {
- return null;
- }
- decodedCodes.push(code);
- result.push(code.code);
- }
+/***/ }),
- return code;
-};
+/***/ "../../node_modules/@babel/runtime/helpers/typeof.js":
+/*!************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/helpers/typeof.js ***!
+ \************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
-EANReader.prototype._decode = function () {
- var startInfo,
- self = this,
- code,
- result = [],
- decodedCodes = [],
- resultInfo = {};
+function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
- startInfo = self._findStart();
- if (!startInfo) {
- return null;
- }
- code = {
- code: startInfo.code,
- start: startInfo.start,
- end: startInfo.end
+function _typeof(obj) {
+ if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
+ module.exports = _typeof = function _typeof(obj) {
+ return _typeof2(obj);
};
- decodedCodes.push(code);
- code = self._decodePayload(code, result, decodedCodes);
- if (!code) {
- return null;
- }
- code = self._findEnd(code.end, false);
- if (!code) {
- return null;
- }
-
- decodedCodes.push(code);
+ } else {
+ module.exports = _typeof = function _typeof(obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
+ };
+ }
- // Checksum
- if (!self._checksum(result)) {
- return null;
- }
+ return _typeof(obj);
+}
- if (this.supplements.length > 0) {
- var ext = this._decodeExtensions(code.end);
- if (!ext) {
- return null;
- }
- var lastCode = ext.decodedCodes[ext.decodedCodes.length - 1],
- endInfo = {
- start: lastCode.start + ((lastCode.end - lastCode.start) / 2 | 0),
- end: lastCode.end
- };
- if (!self._verifyTrailingWhitespace(endInfo)) {
- return null;
- }
- resultInfo = {
- supplement: ext,
- code: result.join("") + ext.code
- };
- }
+module.exports = _typeof;
- return _extends({
- code: result.join(""),
- start: startInfo.start,
- end: code.end,
- codeset: "",
- startInfo: startInfo,
- decodedCodes: decodedCodes
- }, resultInfo);
-};
+/***/ }),
-EANReader.prototype._decodeExtensions = function (offset) {
- var i,
- start = this._nextSet(this._row, offset),
- startInfo = this._findPattern(this.EXTENSION_START_PATTERN, start, false, false),
- result;
+/***/ "../../node_modules/@babel/runtime/regenerator/index.js":
+/*!***************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/@babel/runtime/regenerator/index.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
- if (startInfo === null) {
- return null;
- }
+module.exports = __webpack_require__(/*! regenerator-runtime */ "../../node_modules/regenerator-runtime/runtime-module.js");
- for (i = 0; i < this.supplements.length; i++) {
- result = this.supplements[i].decode(this._row, startInfo.end);
- if (result !== null) {
- return {
- code: result.code,
- start: start,
- startInfo: startInfo,
- end: result.end,
- codeset: "",
- decodedCodes: result.decodedCodes
- };
- }
- }
- return null;
-};
-EANReader.prototype._checksum = function (result) {
- var sum = 0,
- i;
+/***/ }),
- for (i = result.length - 2; i >= 0; i -= 2) {
- sum += result[i];
- }
- sum *= 3;
- for (i = result.length - 1; i >= 0; i -= 2) {
- sum += result[i];
- }
- return sum % 10 === 0;
-};
+/***/ "../../node_modules/regenerator-runtime/runtime-module.js":
+/*!*****************************************************************************!*\
+ !*** /Users/adomratchev/node_modules/regenerator-runtime/runtime-module.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
-EANReader.CONFIG_KEYS = {
- supplements: {
- 'type': 'arrayOf(string)',
- 'default': [],
- 'description': 'Allowed extensions to be decoded (2 and/or 5)'
- }
-};
+/**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
-/* harmony default export */ __webpack_exports__["a"] = EANReader;
+// This method of obtaining a reference to the global object needs to be
+// kept identical to the way it is obtained in runtime.js
+var g = (function() {
+ return this || (typeof self === "object" && self);
+})() || Function("return this")();
-/***/ }),
-/* 5 */
-/***/ (function(module, exports, __webpack_require__) {
+// Use `getOwnPropertyNames` because not all browsers support calling
+// `hasOwnProperty` on the global `self` object in a worker. See #183.
+var hadRuntime = g.regeneratorRuntime &&
+ Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
-var freeGlobal = __webpack_require__(38);
+// Save the old regeneratorRuntime in case it needs to be restored later.
+var oldRuntime = hadRuntime && g.regeneratorRuntime;
-/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+// Force reevalutation of runtime.js.
+g.regeneratorRuntime = undefined;
-/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || Function('return this')();
+module.exports = __webpack_require__(/*! ./runtime */ "../../node_modules/regenerator-runtime/runtime.js");
-module.exports = root;
+if (hadRuntime) {
+ // Restore the original runtime.
+ g.regeneratorRuntime = oldRuntime;
+} else {
+ // Remove the global property added by runtime.js.
+ try {
+ delete g.regeneratorRuntime;
+ } catch(e) {
+ g.regeneratorRuntime = undefined;
+ }
+}
/***/ }),
-/* 6 */
+
+/***/ "../../node_modules/regenerator-runtime/runtime.js":
+/*!**********************************************************************!*\
+ !*** /Users/adomratchev/node_modules/regenerator-runtime/runtime.js ***!
+ \**********************************************************************/
+/*! no static exports found */
/***/ (function(module, exports) {
/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
+ * Copyright (c) 2014-present, Facebook, Inc.
*
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
*/
-function isObjectLike(value) {
- return value != null && typeof value == 'object';
-}
-module.exports = isObjectLike;
+!(function(global) {
+ "use strict";
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
-/***/ }),
-/* 7 */
-/***/ (function(module, exports) {
+ var inModule = typeof module === "object";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ if (inModule) {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
-module.exports = clone
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = inModule ? module.exports : {};
-/**
- * Creates a new vec2 initialized with values from an existing vector
- *
- * @param {vec2} a vector to clone
- * @returns {vec2} a new 2D vector
- */
-function clone(a) {
- var out = new Float32Array(2)
- out[0] = a[0]
- out[1] = a[1]
- return out
-}
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []);
-/***/ }),
-/* 8 */
-/***/ (function(module, exports, __webpack_require__) {
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
-var Symbol = __webpack_require__(11),
- getRawTag = __webpack_require__(119),
- objectToString = __webpack_require__(146);
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
-/** `Object#toString` result references. */
-var nullTag = '[object Null]',
- undefinedTag = '[object Undefined]';
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+ var IteratorPrototype = {};
+ IteratorPrototype[iteratorSymbol] = function () {
+ return this;
+ };
-/** Built-in value references. */
-var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+ if (NativeIteratorPrototype &&
+ NativeIteratorPrototype !== Op &&
+ hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
-/**
- * The base implementation of `getTag` without fallbacks for buggy environments.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
-function baseGetTag(value) {
- if (value == null) {
- return value === undefined ? undefinedTag : nullTag;
+ var Gp = GeneratorFunctionPrototype.prototype =
+ Generator.prototype = Object.create(IteratorPrototype);
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunctionPrototype[toStringTagSymbol] =
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
}
- return (symToStringTag && symToStringTag in Object(value))
- ? getRawTag(value)
- : objectToString(value);
-}
-module.exports = baseGetTag;
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ if (!(toStringTagSymbol in genFun)) {
+ genFun[toStringTagSymbol] = "GeneratorFunction";
+ }
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
-/***/ }),
-/* 9 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+ runtime.awrap = function(arg) {
+ return { __await: arg };
+ };
-"use strict";
-/* harmony default export */ __webpack_exports__["a"] = {
- drawRect: function drawRect(pos, size, ctx, style) {
- ctx.strokeStyle = style.color;
- ctx.fillStyle = style.color;
- ctx.lineWidth = 1;
- ctx.beginPath();
- ctx.strokeRect(pos.x, pos.y, size.x, size.y);
- },
- drawPath: function drawPath(path, def, ctx, style) {
- ctx.strokeStyle = style.color;
- ctx.fillStyle = style.color;
- ctx.lineWidth = style.lineWidth;
- ctx.beginPath();
- ctx.moveTo(path[0][def.x], path[0][def.y]);
- for (var j = 1; j < path.length; j++) {
- ctx.lineTo(path[j][def.x], path[j][def.y]);
- }
- ctx.closePath();
- ctx.stroke();
- },
- drawImage: function drawImage(imageData, size, ctx) {
- var canvasData = ctx.getImageData(0, 0, size.x, size.y),
- data = canvasData.data,
- imageDataPos = imageData.length,
- canvasDataPos = data.length,
- value;
-
- if (canvasDataPos / imageDataPos !== 4) {
- return false;
- }
- while (imageDataPos--) {
- value = imageData[imageDataPos];
- data[--canvasDataPos] = 255;
- data[--canvasDataPos] = value;
- data[--canvasDataPos] = value;
- data[--canvasDataPos] = value;
- }
- ctx.putImageData(canvasData, 0, 0);
- return true;
+ function AsyncIterator(generator) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+ if (value &&
+ typeof value === "object" &&
+ hasOwn.call(value, "__await")) {
+ return Promise.resolve(value.__await).then(function(value) {
+ invoke("next", value, resolve, reject);
+ }, function(err) {
+ invoke("throw", err, resolve, reject);
+ });
+ }
+
+ return Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration.
+ result.value = unwrapped;
+ resolve(result);
+ }, function(error) {
+ // If a rejected Promise was yielded, throw the rejection back
+ // into the async generator function so it can be handled there.
+ return invoke("throw", error, resolve, reject);
+ });
+ }
}
-};
-/***/ }),
-/* 10 */
-/***/ (function(module, exports, __webpack_require__) {
+ var previousPromise;
-var listCacheClear = __webpack_require__(133),
- listCacheDelete = __webpack_require__(134),
- listCacheGet = __webpack_require__(135),
- listCacheHas = __webpack_require__(136),
- listCacheSet = __webpack_require__(137);
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new Promise(function(resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
-/**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function ListCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : callInvokeWithMethodAndArg();
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
}
-}
-// Add methods to `ListCache`.
-ListCache.prototype.clear = listCacheClear;
-ListCache.prototype['delete'] = listCacheDelete;
-ListCache.prototype.get = listCacheGet;
-ListCache.prototype.has = listCacheHas;
-ListCache.prototype.set = listCacheSet;
+ defineIteratorMethods(AsyncIterator.prototype);
+ AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ return this;
+ };
+ runtime.AsyncIterator = AsyncIterator;
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
-module.exports = ListCache;
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
-var root = __webpack_require__(5);
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
-/** Built-in value references. */
-var Symbol = root.Symbol;
+ context.method = method;
+ context.arg = arg;
-module.exports = Symbol;
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(delegate, context);
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
-/***/ }),
-/* 12 */
-/***/ (function(module, exports, __webpack_require__) {
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
-var eq = __webpack_require__(17);
+ context.dispatchException(context.arg);
-/**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
-function assocIndexOf(array, key) {
- var length = array.length;
- while (length--) {
- if (eq(array[length][0], key)) {
- return length;
- }
- }
- return -1;
-}
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
-module.exports = assocIndexOf;
+ state = GenStateExecuting;
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
-var isArray = __webpack_require__(2),
- isKey = __webpack_require__(130),
- stringToPath = __webpack_require__(154),
- toString = __webpack_require__(165);
+ return {
+ value: record.arg,
+ done: context.done
+ };
-/**
- * Casts `value` to a path array if it's not one.
- *
- * @private
- * @param {*} value The value to inspect.
- * @param {Object} [object] The object to query keys on.
- * @returns {Array} Returns the cast property path array.
- */
-function castPath(value, object) {
- if (isArray(value)) {
- return value;
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
}
- return isKey(value, object) ? [value] : stringToPath(toString(value));
-}
-module.exports = castPath;
+ // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+ if (method === undefined) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ if (delegate.iterator.return) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError(
+ "The iterator does not provide a 'throw' method");
+ }
+ return ContinueSentinel;
+ }
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __webpack_require__) {
+ var record = tryCatch(method, delegate.iterator, context.arg);
-var isKeyable = __webpack_require__(131);
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
-/**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
-function getMapData(map, key) {
- var data = map.__data__;
- return isKeyable(key)
- ? data[typeof key == 'string' ? 'string' : 'hash']
- : data.map;
-}
+ var info = record.arg;
-module.exports = getMapData;
+ if (! info) {
+ context.method = "throw";
+ context.arg = new TypeError("iterator result is not an object");
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value;
-/***/ }),
-/* 15 */
-/***/ (function(module, exports) {
+ // Resume execution at the desired location (see delegateYield).
+ context.next = delegate.nextLoc;
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
+ // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined;
+ }
-/** Used to detect unsigned integer values. */
-var reIsUint = /^(?:0|[1-9]\d*)$/;
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ }
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length &&
- (typeof value == 'number' || reIsUint.test(value)) &&
- (value > -1 && value % 1 == 0 && value < length);
-}
+ // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+ context.delegate = null;
+ return ContinueSentinel;
+ }
-module.exports = isIndex;
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+ Gp[toStringTagSymbol] = "Generator";
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __webpack_require__) {
+ // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
-var getNative = __webpack_require__(22);
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
-/* Built-in method references that are verified to be native. */
-var nativeCreate = getNative(Object, 'create');
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
-module.exports = nativeCreate;
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
-/***/ }),
-/* 17 */
-/***/ (function(module, exports) {
+ this.tryEntries.push(entry);
+ }
-/**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
-function eq(value, other) {
- return value === other || (value !== value && other !== other);
-}
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
-module.exports = eq;
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
-var baseIsArguments = __webpack_require__(96),
- isObjectLike = __webpack_require__(6);
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
-/** Built-in value references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
-/**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- * else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
- return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
- !propertyIsEnumerable.call(value, 'callee');
-};
+ next.value = undefined;
+ next.done = true;
-module.exports = isArguments;
+ return next;
+ };
+ return next.next = next;
+ }
+ }
-/***/ }),
-/* 19 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cluster__ = __webpack_require__(50);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__array_helper__ = __webpack_require__(3);
-/* harmony export (immutable) */ __webpack_exports__["b"] = imageRef;
-/* unused harmony export computeIntegralImage2 */
-/* unused harmony export computeIntegralImage */
-/* unused harmony export thresholdImage */
-/* unused harmony export computeHistogram */
-/* unused harmony export sharpenLine */
-/* unused harmony export determineOtsuThreshold */
-/* harmony export (immutable) */ __webpack_exports__["f"] = otsuThreshold;
-/* unused harmony export computeBinaryImage */
-/* harmony export (immutable) */ __webpack_exports__["g"] = cluster;
-/* unused harmony export Tracer */
-/* unused harmony export DILATE */
-/* unused harmony export ERODE */
-/* unused harmony export dilate */
-/* unused harmony export erode */
-/* unused harmony export subtract */
-/* unused harmony export bitwiseOr */
-/* unused harmony export countNonZero */
-/* harmony export (immutable) */ __webpack_exports__["h"] = topGeneric;
-/* unused harmony export grayArrayFromImage */
-/* unused harmony export grayArrayFromContext */
-/* harmony export (immutable) */ __webpack_exports__["c"] = grayAndHalfSampleFromCanvasData;
-/* harmony export (immutable) */ __webpack_exports__["d"] = computeGray;
-/* unused harmony export loadImageArray */
-/* harmony export (immutable) */ __webpack_exports__["i"] = halfSample;
-/* harmony export (immutable) */ __webpack_exports__["a"] = hsv2rgb;
-/* unused harmony export _computeDivisors */
-/* harmony export (immutable) */ __webpack_exports__["e"] = calculatePatchSize;
-/* unused harmony export _parseCSSDimensionValues */
-/* unused harmony export _dimensionsConverters */
-/* harmony export (immutable) */ __webpack_exports__["j"] = computeImageArea;
-
-
-var vec2 = {
- clone: __webpack_require__(7)
-};
-var vec3 = {
- clone: __webpack_require__(83)
-};
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
-/**
- * @param x x-coordinate
- * @param y y-coordinate
- * @return ImageReference {x,y} Coordinate
- */
-function imageRef(x, y) {
- var that = {
- x: x,
- y: y,
- toVec2: function toVec2() {
- return vec2.clone([this.x, this.y]);
- },
- toVec3: function toVec3() {
- return vec3.clone([this.x, this.y, 1]);
- },
- round: function round() {
- this.x = this.x > 0.0 ? Math.floor(this.x + 0.5) : Math.floor(this.x - 0.5);
- this.y = this.y > 0.0 ? Math.floor(this.y + 0.5) : Math.floor(this.y - 0.5);
- return this;
- }
- };
- return that;
-};
+ Context.prototype = {
+ constructor: Context,
-/**
- * Computes an integral image of a given grayscale image.
- * @param imageDataContainer {ImageDataContainer} the image to be integrated
- */
-function computeIntegralImage2(imageWrapper, integralWrapper) {
- var imageData = imageWrapper.data;
- var width = imageWrapper.size.x;
- var height = imageWrapper.size.y;
- var integralImageData = integralWrapper.data;
- var sum = 0,
- posA = 0,
- posB = 0,
- posC = 0,
- posD = 0,
- x,
- y;
-
- // sum up first column
- posB = width;
- sum = 0;
- for (y = 1; y < height; y++) {
- sum += imageData[posA];
- integralImageData[posB] += sum;
- posA += width;
- posB += width;
- }
-
- posA = 0;
- posB = 1;
- sum = 0;
- for (x = 1; x < width; x++) {
- sum += imageData[posA];
- integralImageData[posB] += sum;
- posA++;
- posB++;
- }
-
- for (y = 1; y < height; y++) {
- posA = y * width + 1;
- posB = (y - 1) * width + 1;
- posC = y * width;
- posD = (y - 1) * width;
- for (x = 1; x < width; x++) {
- integralImageData[posA] += imageData[posA] + integralImageData[posB] + integralImageData[posC] - integralImageData[posD];
- posA++;
- posB++;
- posC++;
- posD++;
- }
- }
-};
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ this.sent = this._sent = undefined;
+ this.done = false;
+ this.delegate = null;
-function computeIntegralImage(imageWrapper, integralWrapper) {
- var imageData = imageWrapper.data;
- var width = imageWrapper.size.x;
- var height = imageWrapper.size.y;
- var integralImageData = integralWrapper.data;
- var sum = 0;
+ this.method = "next";
+ this.arg = undefined;
- // sum up first row
- for (var i = 0; i < width; i++) {
- sum += imageData[i];
- integralImageData[i] = sum;
- }
+ this.tryEntries.forEach(resetTryEntry);
- for (var v = 1; v < height; v++) {
- sum = 0;
- for (var u = 0; u < width; u++) {
- sum += imageData[v * width + u];
- integralImageData[v * width + u] = sum + integralImageData[(v - 1) * width + u];
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
}
- }
-};
-
-function thresholdImage(imageWrapper, threshold, targetWrapper) {
- if (!targetWrapper) {
- targetWrapper = imageWrapper;
- }
- var imageData = imageWrapper.data,
- length = imageData.length,
- targetData = targetWrapper.data;
+ }
+ },
- while (length--) {
- targetData[length] = imageData[length] < threshold ? 1 : 0;
- }
-};
+ stop: function() {
+ this.done = true;
-function computeHistogram(imageWrapper, bitsPerPixel) {
- if (!bitsPerPixel) {
- bitsPerPixel = 8;
- }
- var imageData = imageWrapper.data,
- length = imageData.length,
- bitShift = 8 - bitsPerPixel,
- bucketCnt = 1 << bitsPerPixel,
- hist = new Int32Array(bucketCnt);
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
- while (length--) {
- hist[imageData[length] >> bitShift]++;
- }
- return hist;
-};
+ return this.rval;
+ },
-function sharpenLine(line) {
- var i,
- length = line.length,
- left = line[0],
- center = line[1],
- right;
-
- for (i = 1; i < length - 1; i++) {
- right = line[i + 1];
- // -1 4 -1 kernel
- line[i - 1] = center * 2 - left - right & 255;
- left = center;
- center = right;
- }
- return line;
-};
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
-function determineOtsuThreshold(imageWrapper, bitsPerPixel) {
- if (!bitsPerPixel) {
- bitsPerPixel = 8;
- }
- var hist,
- threshold,
- bitShift = 8 - bitsPerPixel;
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
- function px(init, end) {
- var sum = 0,
- i;
- for (i = init; i <= end; i++) {
- sum += hist[i];
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined;
}
- return sum;
- }
- function mx(init, end) {
- var i,
- sum = 0;
+ return !! caught;
+ }
- for (i = init; i <= end; i++) {
- sum += i * hist[i];
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
}
- return sum;
- }
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
- function determineThreshold() {
- var vet = [0],
- p1,
- p2,
- p12,
- k,
- m1,
- m2,
- m12,
- max = (1 << bitsPerPixel) - 1;
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
- hist = computeHistogram(imageWrapper, bitsPerPixel);
- for (k = 1; k < max; k++) {
- p1 = px(0, k);
- p2 = px(k + 1, max);
- p12 = p1 * p2;
- if (p12 === 0) {
- p12 = 1;
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
}
- m1 = mx(0, k) * p2;
- m2 = mx(k + 1, max) * p1;
- m12 = m1 - m2;
- vet[k] = m12 * m12 / p12;
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
}
- return __WEBPACK_IMPORTED_MODULE_1__array_helper__["a" /* default */].maxIndex(vet);
- }
+ }
+ },
- threshold = determineThreshold();
- return threshold << bitShift;
-};
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
-function otsuThreshold(imageWrapper, targetWrapper) {
- var threshold = determineOtsuThreshold(imageWrapper);
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
- thresholdImage(imageWrapper, threshold, targetWrapper);
- return threshold;
-};
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
-// local thresholding
-function computeBinaryImage(imageWrapper, integralWrapper, targetWrapper) {
- computeIntegralImage(imageWrapper, integralWrapper);
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
- if (!targetWrapper) {
- targetWrapper = imageWrapper;
- }
- var imageData = imageWrapper.data;
- var targetData = targetWrapper.data;
- var width = imageWrapper.size.x;
- var height = imageWrapper.size.y;
- var integralImageData = integralWrapper.data;
- var sum = 0,
- v,
- u,
- kernel = 3,
- A,
- B,
- C,
- D,
- avg,
- size = (kernel * 2 + 1) * (kernel * 2 + 1);
+ return this.complete(record);
+ },
- // clear out top & bottom-border
- for (v = 0; v <= kernel; v++) {
- for (u = 0; u < width; u++) {
- targetData[v * width + u] = 0;
- targetData[(height - 1 - v) * width + u] = 0;
- }
- }
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
- // clear out left & right border
- for (v = kernel; v < height - kernel; v++) {
- for (u = 0; u <= kernel; u++) {
- targetData[v * width + u] = 0;
- targetData[v * width + (width - 1 - u)] = 0;
+ return ContinueSentinel;
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
}
- }
+ }
+ },
- for (v = kernel + 1; v < height - kernel - 1; v++) {
- for (u = kernel + 1; u < width - kernel; u++) {
- A = integralImageData[(v - kernel - 1) * width + (u - kernel - 1)];
- B = integralImageData[(v - kernel - 1) * width + (u + kernel)];
- C = integralImageData[(v + kernel) * width + (u - kernel - 1)];
- D = integralImageData[(v + kernel) * width + (u + kernel)];
- sum = D - C - B + A;
- avg = sum / size;
- targetData[v * width + u] = imageData[v * width + u] > avg + 5 ? 0 : 1;
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
}
- }
-};
+ }
-function cluster(points, threshold, property) {
- var i,
- k,
- cluster,
- point,
- clusters = [];
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
- if (!property) {
- property = "rad";
- }
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined;
+ }
- function addToCluster(newPoint) {
- var found = false;
- for (k = 0; k < clusters.length; k++) {
- cluster = clusters[k];
- if (cluster.fits(newPoint)) {
- cluster.add(newPoint);
- found = true;
- }
- }
- return found;
+ return ContinueSentinel;
}
+ };
+})(
+ // In sloppy mode, unbound `this` refers to the global object, fallback to
+ // Function constructor if we're in global strict mode. That is sadly a form
+ // of indirect eval which violates Content Security Policy.
+ (function() {
+ return this || (typeof self === "object" && self);
+ })() || Function("return this")()
+);
- // iterate over each cloud
- for (i = 0; i < points.length; i++) {
- point = __WEBPACK_IMPORTED_MODULE_0__cluster__["a" /* default */].createPoint(points[i], i, property);
- if (!addToCluster(point)) {
- clusters.push(__WEBPACK_IMPORTED_MODULE_0__cluster__["a" /* default */].create(point, threshold));
- }
- }
- return clusters;
-};
-var Tracer = {
- trace: function trace(points, vec) {
- var iteration,
- maxIterations = 10,
- top = [],
- result = [],
- centerPos = 0,
- currentPos = 0;
-
- function trace(idx, forward) {
- var from,
- to,
- toIdx,
- predictedPos,
- thresholdX = 1,
- thresholdY = Math.abs(vec[1] / 10),
- found = false;
-
- function match(pos, predicted) {
- if (pos.x > predicted.x - thresholdX && pos.x < predicted.x + thresholdX && pos.y > predicted.y - thresholdY && pos.y < predicted.y + thresholdY) {
- return true;
- } else {
- return false;
- }
- }
+/***/ }),
- // check if the next index is within the vec specifications
- // if not, check as long as the threshold is met
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
- from = points[idx];
- if (forward) {
- predictedPos = {
- x: from.x + vec[0],
- y: from.y + vec[1]
- };
- } else {
- predictedPos = {
- x: from.x - vec[0],
- y: from.y - vec[1]
- };
- }
+var g;
- toIdx = forward ? idx + 1 : idx - 1;
- to = points[toIdx];
- while (to && (found = match(to, predictedPos)) !== true && Math.abs(to.y - from.y) < vec[1]) {
- toIdx = forward ? toIdx + 1 : toIdx - 1;
- to = points[toIdx];
- }
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
- return found ? toIdx : null;
- }
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || new Function("return this")();
+} catch (e) {
+ // This works if the window reference is available
+ if (typeof window === "object") g = window;
+}
- for (iteration = 0; iteration < maxIterations; iteration++) {
- // randomly select point to start with
- centerPos = Math.floor(Math.random() * points.length);
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
- // trace forward
- top = [];
- currentPos = centerPos;
- top.push(points[currentPos]);
- while ((currentPos = trace(currentPos, true)) !== null) {
- top.push(points[currentPos]);
- }
- if (centerPos > 0) {
- currentPos = centerPos;
- while ((currentPos = trace(currentPos, false)) !== null) {
- top.push(points[currentPos]);
- }
- }
+module.exports = g;
- if (top.length > result.length) {
- result = top;
- }
- }
- return result;
- }
-};
-var DILATE = 1;
-var ERODE = 2;
-
-function dilate(inImageWrapper, outImageWrapper) {
- var v,
- u,
- inImageData = inImageWrapper.data,
- outImageData = outImageWrapper.data,
- height = inImageWrapper.size.y,
- width = inImageWrapper.size.x,
- sum,
- yStart1,
- yStart2,
- xStart1,
- xStart2;
-
- for (v = 1; v < height - 1; v++) {
- for (u = 1; u < width - 1; u++) {
- yStart1 = v - 1;
- yStart2 = v + 1;
- xStart1 = u - 1;
- xStart2 = u + 1;
- sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2];
- outImageData[v * width + u] = sum > 0 ? 1 : 0;
- }
- }
-};
+/***/ }),
-function erode(inImageWrapper, outImageWrapper) {
- var v,
- u,
- inImageData = inImageWrapper.data,
- outImageData = outImageWrapper.data,
- height = inImageWrapper.size.y,
- width = inImageWrapper.size.x,
- sum,
- yStart1,
- yStart2,
- xStart1,
- xStart2;
-
- for (v = 1; v < height - 1; v++) {
- for (u = 1; u < width - 1; u++) {
- yStart1 = v - 1;
- yStart2 = v + 1;
- xStart1 = u - 1;
- xStart2 = u + 1;
- sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2];
- outImageData[v * width + u] = sum === 5 ? 1 : 0;
- }
- }
-};
+/***/ "./src/analytics/result-collector.ts":
+/*!*******************************************!*\
+ !*** ./src/analytics/result-collector.ts ***!
+ \*******************************************/
+/*! exports provided: ResultCollector */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-function subtract(aImageWrapper, bImageWrapper, resultImageWrapper) {
- if (!resultImageWrapper) {
- resultImageWrapper = aImageWrapper;
- }
- var length = aImageWrapper.data.length,
- aImageData = aImageWrapper.data,
- bImageData = bImageWrapper.data,
- cImageData = resultImageWrapper.data;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResultCollector", function() { return ResultCollector; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _common_image_debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/image-debug */ "./src/common/image-debug.ts");
- while (length--) {
- cImageData[length] = aImageData[length] - bImageData[length];
- }
-};
-function bitwiseOr(aImageWrapper, bImageWrapper, resultImageWrapper) {
- if (!resultImageWrapper) {
- resultImageWrapper = aImageWrapper;
- }
- var length = aImageWrapper.data.length,
- aImageData = aImageWrapper.data,
- bImageData = bImageWrapper.data,
- cImageData = resultImageWrapper.data;
- while (length--) {
- cImageData[length] = aImageData[length] || bImageData[length];
- }
-};
-function countNonZero(imageWrapper) {
- var length = imageWrapper.data.length,
- data = imageWrapper.data,
- sum = 0;
+var ResultCollector =
+/*#__PURE__*/
+function () {
+ function ResultCollector(config) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResultCollector);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvas", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_context", void 0);
- while (length--) {
- sum += data[length];
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_config", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_capacity", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_capture", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_results", void 0);
+
+ this._results = new Array();
+ this._config = config;
+ this._capacity = config.capacity || 20;
+ this._capture = config.capture === true;
+
+ if (this._capture) {
+ this._canvas = document.createElement('canvas');
+ this._context = this._canvas.getContext('2d');
}
- return sum;
-};
+ }
-function topGeneric(list, top, scoreFunc) {
- var i,
- minIdx = 0,
- min = 0,
- queue = [],
- score,
- hit,
- pos;
-
- for (i = 0; i < top; i++) {
- queue[i] = {
- score: 0,
- item: null
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ResultCollector, [{
+ key: "addResult",
+ value: function addResult(data, imageWidth, imageHeight, codeResult) {
+ if (codeResult && this._capacity && !this._contains(codeResult) && this._passesFilter(codeResult)) {
+ var result = {
+ codeResult: codeResult
};
- }
+ this._capacity--;
- for (i = 0; i < list.length; i++) {
- score = scoreFunc.apply(this, [list[i]]);
- if (score > min) {
- hit = queue[minIdx];
- hit.score = score;
- hit.item = list[i];
- min = Number.MAX_VALUE;
- for (pos = 0; pos < top; pos++) {
- if (queue[pos].score < min) {
- min = queue[pos].score;
- minIdx = pos;
- }
- }
+ if (this._capture) {
+ this._canvas.width = imageWidth;
+ this._canvas.height = imageHeight;
+ _common_image_debug__WEBPACK_IMPORTED_MODULE_3__["ImageDebug"].drawImage(data, imageWidth, imageHeight, this._context);
+ result.frame = this._canvas.toDataURL();
}
+
+ this._results.push(result);
+ }
+ }
+ }, {
+ key: "getResults",
+ value: function getResults() {
+ return this._results;
+ }
+ }, {
+ key: "_contains",
+ value: function _contains(codeResult) {
+ return this._config.blacklist && this._config.blacklist.some(function (item) {
+ return Object.keys(item).every(function (key) {
+ return item[key] === codeResult[key];
+ });
+ });
+ }
+ }, {
+ key: "_passesFilter",
+ value: function _passesFilter(codeResult) {
+ return typeof this._config.filter !== 'function' || this._config.filter(codeResult);
}
+ }]);
- return queue;
-};
+ return ResultCollector;
+}();
-function grayArrayFromImage(htmlImage, offsetX, ctx, array) {
- ctx.drawImage(htmlImage, offsetX, 0, htmlImage.width, htmlImage.height);
- var ctxData = ctx.getImageData(offsetX, 0, htmlImage.width, htmlImage.height).data;
- computeGray(ctxData, array);
-};
+/***/ }),
-function grayArrayFromContext(ctx, size, offset, array) {
- var ctxData = ctx.getImageData(offset.x, offset.y, size.x, size.y).data;
- computeGray(ctxData, array);
-};
+/***/ "./src/common/cluster.ts":
+/*!*******************************!*\
+ !*** ./src/common/cluster.ts ***!
+ \*******************************/
+/*! exports provided: Cluster */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-function grayAndHalfSampleFromCanvasData(canvasData, size, outArray) {
- var topRowIdx = 0;
- var bottomRowIdx = size.x;
- var endIdx = Math.floor(canvasData.length / 4);
- var outWidth = size.x / 2;
- var outImgIdx = 0;
- var inWidth = size.x;
- var i;
-
- while (bottomRowIdx < endIdx) {
- for (i = 0; i < outWidth; i++) {
- outArray[outImgIdx] = (0.299 * canvasData[topRowIdx * 4 + 0] + 0.587 * canvasData[topRowIdx * 4 + 1] + 0.114 * canvasData[topRowIdx * 4 + 2] + (0.299 * canvasData[(topRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(topRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(topRowIdx + 1) * 4 + 2]) + (0.299 * canvasData[bottomRowIdx * 4 + 0] + 0.587 * canvasData[bottomRowIdx * 4 + 1] + 0.114 * canvasData[bottomRowIdx * 4 + 2]) + (0.299 * canvasData[(bottomRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(bottomRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(bottomRowIdx + 1) * 4 + 2])) / 4;
- outImgIdx++;
- topRowIdx = topRowIdx + 2;
- bottomRowIdx = bottomRowIdx + 2;
- }
- topRowIdx = topRowIdx + inWidth;
- bottomRowIdx = bottomRowIdx + inWidth;
- }
-};
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cluster", function() { return Cluster; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
-function computeGray(imageData, outArray, config) {
- var l = imageData.length / 4 | 0,
- i,
- singleChannel = config && config.singleChannel === true;
- if (singleChannel) {
- for (i = 0; i < l; i++) {
- outArray[i] = imageData[i * 4 + 0];
- }
- } else {
- for (i = 0; i < l; i++) {
- outArray[i] = 0.299 * imageData[i * 4 + 0] + 0.587 * imageData[i * 4 + 1] + 0.114 * imageData[i * 4 + 2];
- }
- }
-};
-function loadImageArray(src, callback, canvas) {
- if (!canvas) {
- canvas = document.createElement('canvas');
- }
- var img = new Image();
- img.callback = callback;
- img.onload = function () {
- canvas.width = this.width;
- canvas.height = this.height;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(this, 0, 0);
- var array = new Uint8Array(this.width * this.height);
- ctx.drawImage(this, 0, 0);
- var data = ctx.getImageData(0, 0, this.width, this.height).data;
- computeGray(data, array);
- this.callback(array, {
- x: this.width,
- y: this.height
- }, this);
- };
- img.src = src;
-};
/**
- * @param inImg {ImageWrapper} input image to be sampled
- * @param outImg {ImageWrapper} to be stored in
+ * Creates a cluster for grouping similar orientations of moments
*/
-function halfSample(inImgWrapper, outImgWrapper) {
- var inImg = inImgWrapper.data;
- var inWidth = inImgWrapper.size.x;
- var outImg = outImgWrapper.data;
- var topRowIdx = 0;
- var bottomRowIdx = inWidth;
- var endIdx = inImg.length;
- var outWidth = inWidth / 2;
- var outImgIdx = 0;
- while (bottomRowIdx < endIdx) {
- for (var i = 0; i < outWidth; i++) {
- outImg[outImgIdx] = Math.floor((inImg[topRowIdx] + inImg[topRowIdx + 1] + inImg[bottomRowIdx] + inImg[bottomRowIdx + 1]) / 4);
- outImgIdx++;
- topRowIdx = topRowIdx + 2;
- bottomRowIdx = bottomRowIdx + 2;
+var Cluster =
+/*#__PURE__*/
+function () {
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Cluster, null, [{
+ key: "clusterize",
+ value: function clusterize(moments, threshold) {
+ var clusters = new Array();
+ moments.forEach(function (moment) {
+ var matchingCluster = clusters.find(function (cluster) {
+ return cluster.fits(moment);
+ });
+
+ if (matchingCluster) {
+ matchingCluster.add(moment);
+ } else {
+ clusters.push(new Cluster(threshold, moment));
}
- topRowIdx = topRowIdx + inWidth;
- bottomRowIdx = bottomRowIdx + inWidth;
+ });
+ return clusters;
}
-};
+ }]);
-function hsv2rgb(hsv, rgb) {
- var h = hsv[0],
- s = hsv[1],
- v = hsv[2],
- c = v * s,
- x = c * (1 - Math.abs(h / 60 % 2 - 1)),
- m = v - c,
- r = 0,
- g = 0,
- b = 0;
-
- rgb = rgb || [0, 0, 0];
-
- if (h < 60) {
- r = c;
- g = x;
- } else if (h < 120) {
- r = x;
- g = c;
- } else if (h < 180) {
- g = c;
- b = x;
- } else if (h < 240) {
- g = x;
- b = c;
- } else if (h < 300) {
- r = x;
- b = c;
- } else if (h < 360) {
- r = c;
- b = x;
- }
- rgb[0] = (r + m) * 255 | 0;
- rgb[1] = (g + m) * 255 | 0;
- rgb[2] = (b + m) * 255 | 0;
- return rgb;
-};
+ function Cluster(threshold, moment) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Cluster);
-function _computeDivisors(n) {
- var largeDivisors = [],
- divisors = [],
- i;
-
- for (i = 1; i < Math.sqrt(n) + 1; i++) {
- if (n % i === 0) {
- divisors.push(i);
- if (i !== n / i) {
- largeDivisors.unshift(Math.floor(n / i));
- }
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_threshold", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_moments", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_center", void 0);
+
+ this._threshold = threshold;
+ this._moments = new Array();
+ this._center = {
+ rad: 0,
+ x: 0,
+ y: 0
+ };
+
+ if (moment) {
+ this.add(moment);
}
- return divisors.concat(largeDivisors);
-};
+ }
-function _computeIntersection(arr1, arr2) {
- var i = 0,
- j = 0,
- result = [];
-
- while (i < arr1.length && j < arr2.length) {
- if (arr1[i] === arr2[j]) {
- result.push(arr1[i]);
- i++;
- j++;
- } else if (arr1[i] > arr2[j]) {
- j++;
- } else {
- i++;
- }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Cluster, [{
+ key: "add",
+ value: function add(point) {
+ this._moments.push(point); // Update center
+
+
+ this._center.rad = this._moments.reduce(function (sum, p) {
+ return sum + p.rad;
+ }, 0) / this._moments.length;
+ this._center.x = Math.cos(this._center.rad);
+ this._center.y = Math.sin(this._center.rad);
}
- return result;
-};
+ }, {
+ key: "fits",
+ value: function fits(moment) {
+ // check cosine similarity to center-angle
+ var similarity = Math.abs(moment.x * this._center.x + moment.y * this._center.y);
+ return similarity > this._threshold;
+ }
+ }, {
+ key: "moments",
+ get: function get() {
+ return this._moments;
+ }
+ }]);
-function calculatePatchSize(patchSize, imgSize) {
- var divisorsX = _computeDivisors(imgSize.x),
- divisorsY = _computeDivisors(imgSize.y),
- wideSide = Math.max(imgSize.x, imgSize.y),
- common = _computeIntersection(divisorsX, divisorsY),
- nrOfPatchesList = [8, 10, 15, 20, 32, 60, 80],
- nrOfPatchesMap = {
- "x-small": 5,
- "small": 4,
- "medium": 3,
- "large": 2,
- "x-large": 1
- },
- nrOfPatchesIdx = nrOfPatchesMap[patchSize] || nrOfPatchesMap.medium,
- nrOfPatches = nrOfPatchesList[nrOfPatchesIdx],
- desiredPatchSize = Math.floor(wideSide / nrOfPatches),
- optimalPatchSize;
+ return Cluster;
+}();
- function findPatchSizeForDivisors(divisors) {
- var i = 0,
- found = divisors[Math.floor(divisors.length / 2)];
+/***/ }),
- while (i < divisors.length - 1 && divisors[i] < desiredPatchSize) {
- i++;
- }
- if (i > 0) {
- if (Math.abs(divisors[i] - desiredPatchSize) > Math.abs(divisors[i - 1] - desiredPatchSize)) {
- found = divisors[i - 1];
- } else {
- found = divisors[i];
- }
- }
- if (desiredPatchSize / found < nrOfPatchesList[nrOfPatchesIdx + 1] / nrOfPatchesList[nrOfPatchesIdx] && desiredPatchSize / found > nrOfPatchesList[nrOfPatchesIdx - 1] / nrOfPatchesList[nrOfPatchesIdx]) {
- return { x: found, y: found };
+/***/ "./src/common/events.ts":
+/*!******************************!*\
+ !*** ./src/common/events.ts ***!
+ \******************************/
+/*! exports provided: Events */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Events", function() { return Events; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+
+
+var events = {};
+var Events =
+/*#__PURE__*/
+function () {
+ function Events() {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Events);
+ }
+
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Events, null, [{
+ key: "subscribe",
+ value: function subscribe(event, callback, async) {
+ var subscription;
+
+ if (typeof callback === 'function') {
+ subscription = {
+ callback: callback,
+ async: async
+ };
+ } else {
+ subscription = callback;
+
+ if (!subscription.callback) {
+ throw 'Callback was not specified on options';
}
- return null;
- }
+ }
- optimalPatchSize = findPatchSizeForDivisors(common);
- if (!optimalPatchSize) {
- optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(wideSide));
- if (!optimalPatchSize) {
- optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(desiredPatchSize * nrOfPatches));
+ getEvent(event).subscriptions.push(subscription);
+ }
+ }, {
+ key: "publish",
+ value: function publish(type, data) {
+ var eventItem = getEvent(type);
+ var subscriptions = eventItem.subscriptions; // Publish one-time subscriptions
+
+ subscriptions.filter(function (_ref) {
+ var once = _ref.once;
+ return !!once;
+ }).forEach(function (subscription) {
+ return publishSubscription(subscription, data);
+ }); // remove them from the subscription
+
+ eventItem.subscriptions = subscriptions.filter(function (_ref2) {
+ var once = _ref2.once;
+ return !once;
+ }); // publish the rest
+
+ eventItem.subscriptions.forEach(function (subscription) {
+ return publishSubscription(subscription, data);
+ });
+ }
+ }, {
+ key: "once",
+ value: function once(event, callback, async) {
+ Events.subscribe(event, {
+ callback: callback,
+ async: async,
+ once: true
+ });
+ }
+ }, {
+ key: "unsubscribe",
+ value: function unsubscribe(eventName, callback) {
+ if (eventName) {
+ var event = getEvent(eventName);
+
+ if (event && callback) {
+ event.subscriptions = event.subscriptions.filter(function (subscription) {
+ return subscription.callback !== callback;
+ });
+ } else {
+ event.subscriptions = [];
}
+ } else {
+ events = {};
+ }
}
- return optimalPatchSize;
-};
+ }]);
+
+ return Events;
+}();
-function _parseCSSDimensionValues(value) {
- var dimension = {
- value: parseFloat(value),
- unit: value.indexOf("%") === value.length - 1 ? "%" : "%"
+function getEvent(eventName) {
+ if (!events[eventName]) {
+ events[eventName] = {
+ subscriptions: []
};
+ }
- return dimension;
-};
+ return events[eventName];
+}
-var _dimensionsConverters = {
- top: function top(dimension, context) {
- if (dimension.unit === "%") {
- return Math.floor(context.height * (dimension.value / 100));
- }
- },
- right: function right(dimension, context) {
- if (dimension.unit === "%") {
- return Math.floor(context.width - context.width * (dimension.value / 100));
- }
- },
- bottom: function bottom(dimension, context) {
- if (dimension.unit === "%") {
- return Math.floor(context.height - context.height * (dimension.value / 100));
- }
- },
- left: function left(dimension, context) {
- if (dimension.unit === "%") {
- return Math.floor(context.width * (dimension.value / 100));
- }
- }
-};
+function publishSubscription(subscription, data) {
+ if (subscription.async) {
+ setTimeout(function () {
+ subscription.callback(data);
+ }, 4);
+ } else {
+ subscription.callback(data);
+ }
+}
-function computeImageArea(inputWidth, inputHeight, area) {
- var context = { width: inputWidth, height: inputHeight };
+/***/ }),
- var parsedArea = Object.keys(area).reduce(function (result, key) {
- var value = area[key],
- parsed = _parseCSSDimensionValues(value),
- calculated = _dimensionsConverters[key](parsed, context);
+/***/ "./src/common/hsv2rgb.ts":
+/*!*******************************!*\
+ !*** ./src/common/hsv2rgb.ts ***!
+ \*******************************/
+/*! exports provided: hsv2rgb */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- result[key] = calculated;
- return result;
- }, {});
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hsv2rgb", function() { return hsv2rgb; });
+function hsv2rgb(hsv, rgb) {
+ var h = hsv[0];
+ var s = hsv[1];
+ var v = hsv[2];
+ var c = v * s;
+ var x = c * (1 - Math.abs(h / 60 % 2 - 1));
+ var m = v - c;
+ var r = 0;
+ var g = 0;
+ var b = 0;
+
+ if (h < 60) {
+ r = c;
+ g = x;
+ } else if (h < 120) {
+ r = x;
+ g = c;
+ } else if (h < 180) {
+ g = c;
+ b = x;
+ } else if (h < 240) {
+ g = x;
+ b = c;
+ } else if (h < 300) {
+ r = x;
+ b = c;
+ } else if (h < 360) {
+ r = c;
+ b = x;
+ }
- return {
- sx: parsedArea.left,
- sy: parsedArea.top,
- sw: parsedArea.right - parsedArea.left,
- sh: parsedArea.bottom - parsedArea.top
- };
+ rgb = rgb || [0, 0, 0];
+ rgb[0] = (r + m) * 255 | 0;
+ rgb[1] = (g + m) * 255 | 0;
+ rgb[2] = (b + m) * 255 | 0;
+ return rgb;
+}
+
+/***/ }),
+
+/***/ "./src/common/image-debug.ts":
+/*!***********************************!*\
+ !*** ./src/common/image-debug.ts ***!
+ \***********************************/
+/*! exports provided: ImageDebug */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageDebug", function() { return ImageDebug; });
+var ImageDebug = {
+ drawPath: function drawPath(path, context, color, lineWidth) {
+ if (path && path.length > 1) {
+ context.strokeStyle = color;
+ context.fillStyle = color;
+ context.lineWidth = lineWidth;
+ context.beginPath();
+ context.moveTo(path[0].x, path[0].y);
+ path.slice(1).forEach(function (_ref) {
+ var x = _ref.x,
+ y = _ref.y;
+ return context.lineTo(x, y);
+ });
+ context.closePath();
+ context.stroke();
+ }
+ },
+ drawImage: function drawImage(imageData, width, height, context) {
+ var canvasData = context.getImageData(0, 0, width, height);
+ var data = canvasData.data;
+ var imageIndex = imageData.length | 0;
+ var canvasIndex = data.length | 0;
+
+ if (canvasIndex / imageIndex !== 4) {
+ return false;
+ }
+
+ while (imageIndex--) {
+ var value = imageData[imageIndex];
+ data[--canvasIndex] = 255;
+ data[--canvasIndex] = value;
+ data[--canvasIndex] = value;
+ data[--canvasIndex] = value;
+ }
+
+ context.putImageData(canvasData, 0, 0);
+ return true;
+ }
};
/***/ }),
-/* 20 */
+
+/***/ "./src/common/image-wrapper.ts":
+/*!*************************************!*\
+ !*** ./src/common/image-wrapper.ts ***!
+ \*************************************/
+/*! exports provided: ImageWrapper */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__subImage__ = __webpack_require__(53);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_cv_utils__ = __webpack_require__(19);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__common_array_helper__ = __webpack_require__(3);
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageWrapper", function() { return ImageWrapper; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _hsv2rgb__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hsv2rgb */ "./src/common/hsv2rgb.ts");
+
-var vec2 = {
- clone: __webpack_require__(7)
-};
/**
* Represents a basic image combining the data and size.
* In addition, some methods for manipulation are contained.
- * @param size {x,y} The size of the image in pixel
- * @param data {Array} If given, a flat array containing the pixel data
- * @param ArrayType {Type} If given, the desired DataType of the Array (may be typed/non-typed)
- * @param initialize {Boolean} Indicating if the array should be initialized on creation.
- * @returns {ImageWrapper}
*/
-function ImageWrapper(size, data, ArrayType, initialize) {
+var ImageWrapper =
+/*#__PURE__*/
+function () {
+ /**
+ * @param size The size of the image in pixel
+ * @param data If given, a flat array containing the pixel data
+ * @param arrayType If given, the desired DataType of the Array (may be typed/non-typed)
+ * @param initialize Indicating if the array should be initialized on creation.
+ */
+ function ImageWrapper(size, data, arrayType, initialize) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ImageWrapper);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "data", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "size", void 0);
+
if (!data) {
- if (ArrayType) {
- this.data = new ArrayType(size.x * size.y);
- if (ArrayType === Array && initialize) {
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(this.data, 0);
- }
- } else {
- this.data = new Uint8Array(size.x * size.y);
- if (Uint8Array === Array && initialize) {
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(this.data, 0);
- }
- }
+ this.data = new (arrayType || Uint8Array)(size.x * size.y);
+
+ if (initialize) {
+ this.data.fill(0);
+ }
} else {
- this.data = data;
+ this.data = data;
}
+
this.size = size;
-}
+ }
+ /**
+ * Tests if a position is within the image with a given offset
+ * @param point The location to test
+ * @param border The padding value in pixels
+ * @returns true if location inside the image's border, false otherwise
+ * @see cvd/image.h
+ */
-/**
- * tests if a position is within the image with a given offset
- * @param imgRef {x, y} The location to test
- * @param border Number the padding value in pixel
- * @returns {Boolean} true if location inside the image's border, false otherwise
- * @see cvd/image.h
- */
-ImageWrapper.prototype.inImageWithBorder = function (imgRef, border) {
- return imgRef.x >= border && imgRef.y >= border && imgRef.x < this.size.x - border && imgRef.y < this.size.y - border;
-};
-/**
- * Performs bilinear sampling
- * @param inImg Image to extract sample from
- * @param x the x-coordinate
- * @param y the y-coordinate
- * @returns the sampled value
- * @see cvd/vision.h
- */
-ImageWrapper.sample = function (inImg, x, y) {
- var lx = Math.floor(x);
- var ly = Math.floor(y);
- var w = inImg.size.x;
- var base = ly * inImg.size.x + lx;
- var a = inImg.data[base + 0];
- var b = inImg.data[base + 1];
- var c = inImg.data[base + w];
- var d = inImg.data[base + w + 1];
- var e = a - b;
- x -= lx;
- y -= ly;
-
- var result = Math.floor(x * (y * (e - c + d) - e) + y * (c - a) + a);
- return result;
-};
-
-/**
- * Initializes a given array. Sets each element to zero.
- * @param array {Array} The array to initialize
- */
-ImageWrapper.clearArray = function (array) {
- var l = array.length;
- while (l--) {
- array[l] = 0;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ImageWrapper, [{
+ key: "inImageWithBorder",
+ value: function inImageWithBorder(point, border) {
+ return point.x >= border && point.y >= border && point.x < this.size.x - border && point.y < this.size.y - border;
}
-};
-
-/**
- * Creates a {SubImage} from the current image ({this}).
- * @param from {ImageRef} The position where to start the {SubImage} from. (top-left corner)
- * @param size {ImageRef} The size of the resulting image
- * @returns {SubImage} A shared part of the original image
- */
-ImageWrapper.prototype.subImage = function (from, size) {
- return new __WEBPACK_IMPORTED_MODULE_0__subImage__["a" /* default */](from, size, this);
-};
-
-/**
- * Creates an {ImageWrapper) and copies the needed underlying image-data area
- * @param imageWrapper {ImageWrapper} The target {ImageWrapper} where the data should be copied
- * @param from {ImageRef} The location where to copy from (top-left location)
- */
-ImageWrapper.prototype.subImageAsCopy = function (imageWrapper, from) {
- var sizeY = imageWrapper.size.y,
- sizeX = imageWrapper.size.x;
- var x, y;
- for (x = 0; x < sizeX; x++) {
- for (y = 0; y < sizeY; y++) {
- imageWrapper.data[y * sizeX + x] = this.data[(from.y + y) * this.size.x + from.x + x];
+ /**
+ * Creates an {ImageWrapper) and copies the needed underlying image-data area
+ * @param imageWrapper The target {ImageWrapper} where the data should be copied
+ * @param fromX The horizontal position where to copy from
+ * @param fromY The vertical position where to copy from
+ */
+
+ }, {
+ key: "subImageAsCopy",
+ value: function subImageAsCopy(imageWrapper, fromX, fromY) {
+ var sizeY = imageWrapper.size.y;
+ var sizeX = imageWrapper.size.x;
+
+ for (var x = 0; x < sizeX; x++) {
+ for (var y = 0; y < sizeY; y++) {
+ imageWrapper.data[y * sizeX + x] = this.data[(fromY + y) * this.size.x + fromX + x];
}
+ }
}
-};
-
-ImageWrapper.prototype.copyTo = function (imageWrapper) {
- var length = this.data.length,
- srcData = this.data,
- dstData = imageWrapper.data;
+ /**
+ * Retrieves a given pixel position from the image
+ * @param x The x-position
+ * @param y The y-position
+ * @returns The grayscale value at the pixel-position
+ */
- while (length--) {
- dstData[length] = srcData[length];
+ }, {
+ key: "get",
+ value: function get(x, y) {
+ return this.data[y * this.size.x + x];
}
-};
-
-/**
- * Retrieves a given pixel position from the image
- * @param x {Number} The x-position
- * @param y {Number} The y-position
- * @returns {Number} The grayscale value at the pixel-position
- */
-ImageWrapper.prototype.get = function (x, y) {
- return this.data[y * this.size.x + x];
-};
-
-/**
- * Retrieves a given pixel position from the image
- * @param x {Number} The x-position
- * @param y {Number} The y-position
- * @returns {Number} The grayscale value at the pixel-position
- */
-ImageWrapper.prototype.getSafe = function (x, y) {
- var i;
+ /**
+ * Sets a given pixel position in the image
+ * @param x The x-position
+ * @param y The y-position
+ * @param value The grayscale value to set
+ * @returns The Image itself (for possible chaining)
+ */
- if (!this.indexMapping) {
- this.indexMapping = {
- x: [],
- y: []
- };
- for (i = 0; i < this.size.x; i++) {
- this.indexMapping.x[i] = i;
- this.indexMapping.x[i + this.size.x] = i;
- }
- for (i = 0; i < this.size.y; i++) {
- this.indexMapping.y[i] = i;
- this.indexMapping.y[i + this.size.y] = i;
- }
+ }, {
+ key: "set",
+ value: function set(x, y, value) {
+ this.data[y * this.size.x + x] = value;
+ return this;
}
- return this.data[this.indexMapping.y[y + this.size.y] * this.size.x + this.indexMapping.x[x + this.size.x]];
-};
+ /**
+ * Sets the border of the image (1 pixel) to zero
+ */
-/**
- * Sets a given pixel position in the image
- * @param x {Number} The x-position
- * @param y {Number} The y-position
- * @param value {Number} The grayscale value to set
- * @returns {ImageWrapper} The Image itself (for possible chaining)
- */
-ImageWrapper.prototype.set = function (x, y, value) {
- this.data[y * this.size.x + x] = value;
- return this;
-};
+ }, {
+ key: "zeroBorder",
+ value: function zeroBorder() {
+ var width = this.size.x;
+ var height = this.size.y;
+ var data = this.data;
-/**
- * Sets the border of the image (1 pixel) to zero
- */
-ImageWrapper.prototype.zeroBorder = function () {
- var i,
- width = this.size.x,
- height = this.size.y,
- data = this.data;
- for (i = 0; i < width; i++) {
+ for (var i = 0; i < width; i++) {
data[i] = data[(height - 1) * width + i] = 0;
- }
- for (i = 1; i < height - 1; i++) {
- data[i * width] = data[i * width + (width - 1)] = 0;
- }
-};
-
-/**
- * Inverts a binary image in place
- */
-ImageWrapper.prototype.invert = function () {
- var data = this.data,
- length = data.length;
+ }
- while (length--) {
- data[length] = data[length] ? 0 : 1;
+ for (var _i = 1; _i < height - 1; _i++) {
+ data[_i * width] = data[_i * width + (width - 1)] = 0;
+ }
}
-};
+ /**
+ * Inverts a binary image in place
+ */
-ImageWrapper.prototype.convolve = function (kernel) {
- var x,
- y,
- kx,
- ky,
- kSize = kernel.length / 2 | 0,
- accu = 0;
- for (y = 0; y < this.size.y; y++) {
- for (x = 0; x < this.size.x; x++) {
- accu = 0;
- for (ky = -kSize; ky <= kSize; ky++) {
- for (kx = -kSize; kx <= kSize; kx++) {
- accu += kernel[ky + kSize][kx + kSize] * this.getSafe(x + kx, y + ky);
- }
- }
- this.data[y * this.size.x + x] = accu;
- }
+ }, {
+ key: "invert",
+ value: function invert() {
+ var data = this.data;
+
+ for (var i = data.length; i--;) {
+ data[i] = data[i] ? 0 : 1;
+ }
}
-};
+ }, {
+ key: "moments",
+ value: function moments(labelCount) {
+ var height = this.size.y;
+ var width = this.size.x;
+ var labelSum = new Array();
+ var result = new Array();
-ImageWrapper.prototype.moments = function (labelcount) {
- var data = this.data,
- x,
- y,
- height = this.size.y,
- width = this.size.x,
- val,
- ysq,
- labelsum = [],
- i,
- label,
- mu11,
- mu02,
- mu20,
- x_,
- y_,
- tmp,
- result = [],
- PI = Math.PI,
- PI_4 = PI / 4;
-
- if (labelcount <= 0) {
+ if (labelCount <= 0) {
return result;
- }
+ }
- for (i = 0; i < labelcount; i++) {
- labelsum[i] = {
- m00: 0,
- m01: 0,
- m10: 0,
- m11: 0,
- m02: 0,
- m20: 0,
- theta: 0,
- rad: 0
+ for (var i = 0; i < labelCount; i++) {
+ labelSum[i] = {
+ m00: 0,
+ m01: 0,
+ m10: 0,
+ m11: 0,
+ m02: 0,
+ m20: 0,
+ theta: 0,
+ rad: 0
};
- }
+ }
- for (y = 0; y < height; y++) {
- ysq = y * y;
- for (x = 0; x < width; x++) {
- val = data[y * width + x];
- if (val > 0) {
- label = labelsum[val - 1];
- label.m00 += 1;
- label.m01 += y;
- label.m10 += x;
- label.m11 += x * y;
- label.m02 += ysq;
- label.m20 += x * x;
- }
+ for (var y = 0; y < height; y++) {
+ var ysq = y * y;
+
+ for (var x = 0; x < width; x++) {
+ var val = this.data[y * width + x];
+
+ if (val > 0) {
+ var label = labelSum[val - 1];
+ label.m00 += 1;
+ label.m01 += y;
+ label.m10 += x;
+ label.m11 += x * y;
+ label.m02 += ysq;
+ label.m20 += x * x;
+ }
}
- }
+ }
- for (i = 0; i < labelcount; i++) {
- label = labelsum[i];
- if (!isNaN(label.m00) && label.m00 !== 0) {
- x_ = label.m10 / label.m00;
- y_ = label.m01 / label.m00;
- mu11 = label.m11 / label.m00 - x_ * y_;
- mu02 = label.m02 / label.m00 - y_ * y_;
- mu20 = label.m20 / label.m00 - x_ * x_;
- tmp = (mu02 - mu20) / (2 * mu11);
- tmp = 0.5 * Math.atan(tmp) + (mu11 >= 0 ? PI_4 : -PI_4) + PI;
- label.theta = (tmp * 180 / PI + 90) % 180 - 90;
- if (label.theta < 0) {
- label.theta += 180;
- }
- label.rad = tmp > PI ? tmp - PI : tmp;
- label.vec = vec2.clone([Math.cos(tmp), Math.sin(tmp)]);
- result.push(label);
+ var PI = Math.PI;
+ var PI_4 = PI / 4;
+
+ for (var _i2 = 0; _i2 < labelCount; _i2++) {
+ var _label = labelSum[_i2];
+
+ if (!isNaN(_label.m00) && _label.m00 !== 0) {
+ var x_ = _label.m10 / _label.m00;
+ var y_ = _label.m01 / _label.m00;
+ var mu11 = _label.m11 / _label.m00 - x_ * y_;
+ var mu02 = _label.m02 / _label.m00 - y_ * y_;
+ var mu20 = _label.m20 / _label.m00 - x_ * x_;
+ var tmp = 0.5 * Math.atan((mu02 - mu20) / (2 * mu11)) + (mu11 >= 0 ? PI_4 : -PI_4) + PI;
+ _label.theta = (tmp * 180 / PI + 90) % 180 - 90;
+
+ if (_label.theta < 0) {
+ _label.theta += 180;
+ }
+
+ _label.rad = tmp > PI ? tmp - PI : tmp;
+ _label.x = Math.cos(tmp);
+ _label.y = Math.sin(tmp);
+ result.push(_label);
}
+ }
+
+ return result;
}
+ /**
+ * Displays the {ImageWrapper} in a given canvas
+ * @param context The rendering context to write to
+ * @param scale Scale which is applied to each pixel-value
+ */
- return result;
-};
+ }, {
+ key: "show",
+ value: function show(context, scale) {
+ var height = this.size.y;
+ var width = this.size.x; // const context = canvas.getContext('2d');
+ // canvas.height = height;
+ // canvas.width = width;
-/**
- * Displays the {ImageWrapper} in a given canvas
- * @param canvas {Canvas} The canvas element to write to
- * @param scale {Number} Scale which is applied to each pixel-value
- */
-ImageWrapper.prototype.show = function (canvas, scale) {
- var ctx, frame, data, current, pixel, x, y;
+ var frame = context.getImageData(0, 0, width, height);
+ var data = frame.data;
+ var current = 0;
- if (!scale) {
+ if (!scale) {
scale = 1.0;
+ }
+
+ for (var y = 0; y < height; y++) {
+ for (var x = 0; x < width; x++) {
+ var pixel = y * width + x;
+ current = this.get(x, y) * scale;
+ data[pixel * 4 + 0] = current;
+ data[pixel * 4 + 1] = current;
+ data[pixel * 4 + 2] = current;
+ data[pixel * 4 + 3] = 255;
+ }
+ } //frame.data = data;
+
+
+ context.putImageData(frame, 0, 0);
}
- ctx = canvas.getContext('2d');
- canvas.width = this.size.x;
- canvas.height = this.size.y;
- frame = ctx.getImageData(0, 0, canvas.width, canvas.height);
- data = frame.data;
- current = 0;
- for (y = 0; y < this.size.y; y++) {
- for (x = 0; x < this.size.x; x++) {
- pixel = y * this.size.x + x;
- current = this.get(x, y) * scale;
- data[pixel * 4 + 0] = current;
- data[pixel * 4 + 1] = current;
- data[pixel * 4 + 2] = current;
- data[pixel * 4 + 3] = 255;
- }
- }
- //frame.data = data;
- ctx.putImageData(frame, 0, 0);
-};
+ /**
+ * Displays the part of the image in a given canvas
+ * @param context The rendering context to write to
+ * @param scale Scale which is applied to each pixel-value
+ * @param fromX The horizontal position where to overlay from
+ * @param fromY The vertical position where to overlay from
+ */
-/**
- * Displays the {SubImage} in a given canvas
- * @param canvas {Canvas} The canvas element to write to
- * @param scale {Number} Scale which is applied to each pixel-value
- */
-ImageWrapper.prototype.overlay = function (canvas, scale, from) {
- if (!scale || scale < 0 || scale > 360) {
+ }, {
+ key: "overlay",
+ value: function overlay(context, scale, fromX, fromY) {
+ var hsv = [0, 1, 1];
+ var whiteRgb = [255, 255, 255];
+ var blackRgb = [0, 0, 0];
+ var frame = context.getImageData(fromX, fromY, this.size.x, this.size.y);
+ var data = frame.data;
+
+ if (!scale || scale < 0 || scale > 360) {
scale = 360;
- }
- var hsv = [0, 1, 1];
- var rgb = [0, 0, 0];
- var whiteRgb = [255, 255, 255];
- var blackRgb = [0, 0, 0];
- var result = [];
- var ctx = canvas.getContext('2d');
- var frame = ctx.getImageData(from.x, from.y, this.size.x, this.size.y);
- var data = frame.data;
- var length = this.data.length;
- while (length--) {
+ }
+
+ for (var length = this.data.length; length--;) {
hsv[0] = this.data[length] * scale;
- result = hsv[0] <= 0 ? whiteRgb : hsv[0] >= 360 ? blackRgb : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["a" /* hsv2rgb */])(hsv, rgb);
- data[length * 4 + 0] = result[0];
- data[length * 4 + 1] = result[1];
- data[length * 4 + 2] = result[2];
+ var rgb = hsv[0] <= 0 ? whiteRgb : hsv[0] >= 360 ? blackRgb : Object(_hsv2rgb__WEBPACK_IMPORTED_MODULE_3__["hsv2rgb"])(hsv);
+ data[length * 4 + 0] = rgb[0];
+ data[length * 4 + 1] = rgb[1];
+ data[length * 4 + 2] = rgb[2];
data[length * 4 + 3] = 255;
+ }
+
+ context.putImageData(frame, fromX, fromY);
}
- ctx.putImageData(frame, from.x, from.y);
-};
+ }]);
-/* harmony default export */ __webpack_exports__["a"] = ImageWrapper;
+ return ImageWrapper;
+}();
/***/ }),
-/* 21 */
-/***/ (function(module, exports, __webpack_require__) {
-var defineProperty = __webpack_require__(37);
+/***/ "./src/common/media-devices.ts":
+/*!*************************************!*\
+ !*** ./src/common/media-devices.ts ***!
+ \*************************************/
+/*! exports provided: enumerateDevices, getUserMedia */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/**
- * The base implementation of `assignValue` and `assignMergeValue` without
- * value checks.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
-function baseAssignValue(object, key, value) {
- if (key == '__proto__' && defineProperty) {
- defineProperty(object, key, {
- 'configurable': true,
- 'enumerable': true,
- 'value': value,
- 'writable': true
- });
- } else {
- object[key] = value;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enumerateDevices", function() { return enumerateDevices; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUserMedia", function() { return getUserMedia; });
+function enumerateDevices() {
+ if (navigator.mediaDevices && typeof navigator.mediaDevices.enumerateDevices === 'function') {
+ return navigator.mediaDevices.enumerateDevices();
}
-}
-
-module.exports = baseAssignValue;
-
-
-/***/ }),
-/* 22 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseIsNative = __webpack_require__(97),
- getValue = __webpack_require__(120);
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
- var value = getValue(object, key);
- return baseIsNative(value) ? value : undefined;
+ return Promise.reject(new Error('enumerateDevices is not defined'));
}
+function getUserMedia(constraints) {
+ if (navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === 'function') {
+ return navigator.mediaDevices.getUserMedia(constraints);
+ }
-module.exports = getNative;
-
+ return Promise.reject(new Error('getUserMedia is not defined'));
+}
/***/ }),
-/* 23 */
-/***/ (function(module, exports, __webpack_require__) {
-var isSymbol = __webpack_require__(27);
+/***/ "./src/common/merge.ts":
+/*!*****************************!*\
+ !*** ./src/common/merge.ts ***!
+ \*****************************/
+/*! exports provided: merge */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; });
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../../node_modules/@babel/runtime/helpers/typeof.js");
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
-/** Used as references for various `Number` constants. */
-var INFINITY = 1 / 0;
/**
- * Converts `value` to a string key if it's not a string or symbol.
+ * Performs a deep merge of objects and returns new object.
+ * Does not modify objects (immutable).
+ * @see https://stackoverflow.com/a/48218209
*
- * @private
- * @param {*} value The value to inspect.
- * @returns {string|symbol} Returns the key.
+ * @param objects - Objects to merge
+ * @returns New object with merged key/values
*/
-function toKey(value) {
- if (typeof value == 'string' || isSymbol(value)) {
- return value;
+function merge() {
+ var isObject = function isObject(obj) {
+ return obj && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(obj) === 'object';
+ };
+
+ for (var _len = arguments.length, objects = new Array(_len), _key = 0; _key < _len; _key++) {
+ objects[_key] = arguments[_key];
}
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
-}
-module.exports = toKey;
+ return objects.reduce(function (prev, obj) {
+ if (obj) {
+ Object.keys(obj).forEach(function (key) {
+ var pVal = prev[key];
+ var oVal = obj[key];
+
+ if (Array.isArray(pVal) && Array.isArray(oVal)) {
+ // prev[key] = pVal.concat(...oVal);
+ prev[key] = oVal;
+ } else if (isObject(pVal) && isObject(oVal)) {
+ prev[key] = merge(pVal, oVal);
+ } else {
+ prev[key] = oVal;
+ }
+ });
+ }
+ return prev;
+ }, {});
+}
/***/ }),
-/* 24 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var isFunction = __webpack_require__(25),
- isLength = __webpack_require__(26);
-/**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
-function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
-}
+/***/ "./src/config/config.dev.ts":
+/*!**********************************!*\
+ !*** ./src/config/config.dev.ts ***!
+ \**********************************/
+/*! exports provided: config */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-module.exports = isArrayLike;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; });
+var config = {
+ inputStream: {
+ name: 'Live',
+ type: 'LiveStream',
+ constraints: {
+ width: 640,
+ height: 480,
+ // aspectRatio: 640/480, // optional
+ facingMode: 'environment' // or user
+ // deviceId: '38745983457387598375983759834'
+ },
+ area: {
+ top: '0%',
+ right: '0%',
+ left: '0%',
+ bottom: '0%'
+ },
+ singleChannel: false // true: only the red color-channel is read
+
+ },
+ locate: true,
+ numOfWorkers: 0,
+ decoder: {
+ readers: ['code_128_reader'],
+ debug: {
+ drawBoundingBox: false,
+ showFrequency: false,
+ drawScanline: false,
+ showPattern: false
+ }
+ },
+ locator: {
+ halfSample: true,
+ patchSize: 'medium',
+ // x-small, small, medium, large, x-large
+ debug: {
+ showCanvas: false,
+ showPatches: false,
+ showFoundPatches: false,
+ showSkeleton: false,
+ showLabels: false,
+ showPatchLabels: false,
+ showRemainingPatchLabels: false,
+ boxFromPatches: {
+ showTransformed: false,
+ showTransformedBox: false,
+ showBB: false
+ }
+ }
+ }
+};
/***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
-var baseGetTag = __webpack_require__(8),
- isObject = __webpack_require__(0);
+/***/ "./src/decoder/barcode-decoder.ts":
+/*!****************************************!*\
+ !*** ./src/decoder/barcode-decoder.ts ***!
+ \****************************************/
+/*! exports provided: BarcodeDecoder */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/** `Object#toString` result references. */
-var asyncTag = '[object AsyncFunction]',
- funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]',
- proxyTag = '[object Proxy]';
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BarcodeDecoder", function() { return BarcodeDecoder; });
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../node_modules/@babel/runtime/helpers/toConsumableArray.js");
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../../node_modules/@babel/runtime/helpers/typeof.js");
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _reader_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reader/index */ "./src/reader/index.ts");
+/* harmony import */ var _bresenham__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bresenham */ "./src/decoder/bresenham.ts");
+/* harmony import */ var _common_image_debug__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../common/image-debug */ "./src/common/image-debug.ts");
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
- if (!isObject(value)) {
- return false;
- }
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 9 which returns 'object' for typed arrays and other constructors.
- var tag = baseGetTag(value);
- return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
-}
-module.exports = isFunction;
-/***/ }),
-/* 26 */
-/***/ (function(module, exports) {
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
-function isLength(value) {
- return typeof value == 'number' &&
- value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-module.exports = isLength;
+;
+var BarcodeDecoder =
+/*#__PURE__*/
+function () {
+ function BarcodeDecoder(config, inputImageWrapper) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, BarcodeDecoder);
-/***/ }),
-/* 27 */
-/***/ (function(module, exports, __webpack_require__) {
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_config", void 0);
-var baseGetTag = __webpack_require__(8),
- isObjectLike = __webpack_require__(6);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_inputImageWrapper", void 0);
-/** `Object#toString` result references. */
-var symbolTag = '[object Symbol]';
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_frequencyCanvas", void 0);
-/**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && baseGetTag(value) == symbolTag);
-}
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_patternCanvas", void 0);
-module.exports = isSymbol;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_overlayContext", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(this, "_barcodeReaders", void 0);
-/***/ }),
-/* 28 */
-/***/ (function(module, exports, __webpack_require__) {
+ this._config = config;
+ this._inputImageWrapper = inputImageWrapper;
+ this._barcodeReaders = [];
-var baseMerge = __webpack_require__(100),
- createAssigner = __webpack_require__(116);
+ if ( true && this._config.debug && typeof document !== 'undefined') {
+ var debugDiv = document.querySelector('#debug.detection');
+ this._frequencyCanvas = document.querySelector('canvas.frequency');
-/**
- * This method is like `_.assign` except that it recursively merges own and
- * inherited enumerable string keyed properties of source objects into the
- * destination object. Source properties that resolve to `undefined` are
- * skipped if a destination value exists. Array and plain object properties
- * are merged recursively. Other objects and value types are overridden by
- * assignment. Source objects are applied from left to right. Subsequent
- * sources overwrite property assignments of previous sources.
- *
- * **Note:** This method mutates `object`.
- *
- * @static
- * @memberOf _
- * @since 0.5.0
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var object = {
- * 'a': [{ 'b': 2 }, { 'd': 4 }]
- * };
- *
- * var other = {
- * 'a': [{ 'c': 3 }, { 'e': 5 }]
- * };
- *
- * _.merge(object, other);
- * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
- */
-var merge = createAssigner(function(object, source, srcIndex) {
- baseMerge(object, source, srcIndex);
-});
+ if (!this._frequencyCanvas) {
+ this._frequencyCanvas = document.createElement('canvas');
+ this._frequencyCanvas.className = 'frequency';
-module.exports = merge;
+ if (debugDiv) {
+ debugDiv.appendChild(this._frequencyCanvas);
+ }
+ }
+ this._frequencyCanvas.style.display = this._config.debug.showFrequency ? 'block' : 'none';
+ this._patternCanvas = document.querySelector('canvas.patternBuffer');
-/***/ }),
-/* 29 */
-/***/ (function(module, exports) {
+ if (!this._patternCanvas) {
+ this._patternCanvas = document.createElement('canvas');
+ this._patternCanvas.className = 'patternBuffer';
-module.exports = function(module) {
- if(!module.webpackPolyfill) {
- module.deprecate = function() {};
- module.paths = [];
- // module.parent = undefined by default
- if(!module.children) module.children = [];
- Object.defineProperty(module, "loaded", {
- enumerable: true,
- get: function() {
- return module.l;
- }
- });
- Object.defineProperty(module, "id", {
- enumerable: true,
- get: function() {
- return module.i;
- }
- });
- module.webpackPolyfill = 1;
- }
- return module;
-};
+ if (debugDiv) {
+ debugDiv.appendChild(this._patternCanvas);
+ }
+ }
+ this._patternCanvas.style.display = this._config.debug.showPattern ? 'block' : 'none';
+ var overlayCanvas = document.querySelector('canvas.drawingBuffer');
+ this._overlayContext = overlayCanvas ? overlayCanvas.getContext('2d') : null;
+ }
-/***/ }),
-/* 30 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ this._initReaders();
+ }
-"use strict";
-/**
- * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
- */
-var Tracer = {
- searchDirections: [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]],
- create: function create(imageWrapper, labelWrapper) {
- var imageData = imageWrapper.data,
- labelData = labelWrapper.data,
- searchDirections = this.searchDirections,
- width = imageWrapper.size.x,
- pos;
-
- function _trace(current, color, label, edgelabel) {
- var i, y, x;
-
- for (i = 0; i < 7; i++) {
- y = current.cy + searchDirections[current.dir][0];
- x = current.cx + searchDirections[current.dir][1];
- pos = y * width + x;
- if (imageData[pos] === color && (labelData[pos] === 0 || labelData[pos] === label)) {
- labelData[pos] = label;
- current.cy = y;
- current.cx = x;
- return true;
- } else {
- if (labelData[pos] === 0) {
- labelData[pos] = edgelabel;
- }
- current.dir = (current.dir + 1) % 8;
- }
- }
- return false;
- }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(BarcodeDecoder, [{
+ key: "decodeFromBoundingBoxes",
+ value: function decodeFromBoundingBoxes(boxes) {
+ var _this = this;
- function vertex2D(x, y, dir) {
- return {
- dir: dir,
- x: x,
- y: y,
- next: null,
- prev: null
- };
- }
+ var barcode = null;
- function _contourTracing(sy, sx, label, color, edgelabel) {
- var Fv = null,
- Cv,
- P,
- ldir,
- current = {
- cx: sx,
- cy: sy,
- dir: 0
- };
+ if (boxes) {
+ if (this._config.multiple) {
+ var barcodes = boxes.map(function (box) {
+ return _this.decodeFromBoundingBox(box);
+ });
+ return {
+ barcodes: barcodes,
+ boxes: boxes
+ };
+ }
- if (_trace(current, color, label, edgelabel)) {
- Fv = vertex2D(sx, sy, current.dir);
- Cv = Fv;
- ldir = current.dir;
- P = vertex2D(current.cx, current.cy, 0);
- P.prev = Cv;
- Cv.next = P;
- P.next = null;
- Cv = P;
- do {
- current.dir = (current.dir + 6) % 8;
- _trace(current, color, label, edgelabel);
- if (ldir !== current.dir) {
- Cv.dir = current.dir;
- P = vertex2D(current.cx, current.cy, 0);
- P.prev = Cv;
- Cv.next = P;
- P.next = null;
- Cv = P;
- } else {
- Cv.dir = ldir;
- Cv.x = current.cx;
- Cv.y = current.cy;
- }
- ldir = current.dir;
- } while (current.cx !== sx || current.cy !== sy);
- Fv.prev = Cv.prev;
- Cv.prev.next = Fv;
- }
- return Fv;
+ if (boxes.some(function (box) {
+ return !!(barcode = _this.decodeFromBoundingBox(box));
+ })) {
+ barcode.boxes = boxes;
}
+ }
- return {
- trace: function trace(current, color, label, edgelabel) {
- return _trace(current, color, label, edgelabel);
- },
- contourTracing: function contourTracing(sy, sx, label, color, edgelabel) {
- return _contourTracing(sy, sx, label, color, edgelabel);
- }
- };
+ return barcode;
}
-};
-
-/* harmony default export */ __webpack_exports__["a"] = Tracer;
+ /**
+ * With the help of the configured readers this function tries to detect
+ * a valid barcode pattern within the given area.
+ * @param box The area to search in
+ * @returns The result {codeResult, line, angle, pattern, threshold}
+ */
-/***/ }),
-/* 31 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ }, {
+ key: "decodeFromBoundingBox",
+ value: function decodeFromBoundingBox(box) {
+ var debug = true && this._overlayContext && this._config.debug;
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__barcode_reader__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_array_helper__ = __webpack_require__(3);
+ if (debug && debug.drawBoundingBox) {
+ this._drawPath(box, 'blue', 2);
+ }
+ var line = this._getLine(box);
+ if (line === null) {
+ return null;
+ }
-function Code39Reader() {
- __WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].call(this);
-}
+ var angle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x);
+ line = this._getExtendedLine(line, angle);
-var properties = {
- ALPHABETH_STRING: { value: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%" },
- ALPHABET: { value: [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 45, 46, 32, 42, 36, 47, 43, 37] },
- CHARACTER_ENCODINGS: { value: [0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A] },
- ASTERISK: { value: 0x094 },
- FORMAT: { value: "code_39", writeable: false }
-};
+ var result = this._tryDecode(line);
-Code39Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype, properties);
-Code39Reader.prototype.constructor = Code39Reader;
+ if (result === null) {
+ result = this._tryDecodeBruteForce(box, line, angle);
+ }
-Code39Reader.prototype._decode = function () {
- var self = this,
- counters = [0, 0, 0, 0, 0, 0, 0, 0, 0],
- result = [],
- start = self._findStart(),
- decodedChar,
- lastStart,
- pattern,
- nextStart;
-
- if (!start) {
+ if (result === null) {
return null;
- }
- nextStart = self._nextSet(self._row, start.end);
+ }
- do {
- counters = self._toCounters(nextStart, counters);
- pattern = self._toPattern(counters);
- if (pattern < 0) {
- return null;
- }
- decodedChar = self._patternToChar(pattern);
- if (decodedChar < 0) {
- return null;
- }
- result.push(decodedChar);
- lastStart = nextStart;
- nextStart += __WEBPACK_IMPORTED_MODULE_1__common_array_helper__["a" /* default */].sum(counters);
- nextStart = self._nextSet(self._row, nextStart);
- } while (decodedChar !== '*');
- result.pop();
+ if (debug && debug.drawScanline) {
+ this._drawPath(line, 'red', 3);
+ }
- if (!result.length) {
- return null;
+ return {
+ angle: angle,
+ box: box,
+ codeResult: result.codeResult,
+ line: line,
+ pattern: result.barcodeLine.line,
+ threshold: result.barcodeLine.threshold
+ };
}
+ }, {
+ key: "setReaders",
+ value: function setReaders(readers) {
+ this._config.readers = readers;
+ this._barcodeReaders.length = 0;
- if (!self._verifyTrailingWhitespace(lastStart, nextStart, counters)) {
- return null;
+ this._initReaders();
}
+ }, {
+ key: "_initReaders",
+ value: function _initReaders() {
+ var _this2 = this;
- return {
- code: result.join(""),
- start: start.start,
- end: nextStart,
- startInfo: start,
- decodedCodes: result
- };
-};
+ this._config.readers.forEach(function (readerConfig) {
+ var reader;
+ var configuration = {};
+ var supplements = [];
-Code39Reader.prototype._verifyTrailingWhitespace = function (lastStart, nextStart, counters) {
- var trailingWhitespaceEnd,
- patternSize = __WEBPACK_IMPORTED_MODULE_1__common_array_helper__["a" /* default */].sum(counters);
+ if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1___default()(readerConfig) === 'object') {
+ reader = readerConfig.format;
+ configuration = readerConfig.config || {};
+ } else if (typeof readerConfig === 'string') {
+ reader = readerConfig;
+ }
- trailingWhitespaceEnd = nextStart - lastStart - patternSize;
- if (trailingWhitespaceEnd * 3 >= patternSize) {
- return true;
- }
- return false;
-};
-
-Code39Reader.prototype._patternToChar = function (pattern) {
- var i,
- self = this;
+ if (true) {
+ console.log('Before registering reader:', reader);
+ }
- for (i = 0; i < self.CHARACTER_ENCODINGS.length; i++) {
- if (self.CHARACTER_ENCODINGS[i] === pattern) {
- return String.fromCharCode(self.ALPHABET[i]);
+ if (configuration.supplements) {
+ supplements = configuration.supplements.map(function (supplement) {
+ return new _reader_index__WEBPACK_IMPORTED_MODULE_5__["Readers"][supplement]();
+ });
}
- }
- return -1;
-};
-Code39Reader.prototype._findNextWidth = function (counters, current) {
- var i,
- minWidth = Number.MAX_VALUE;
+ _this2._barcodeReaders.push(new _reader_index__WEBPACK_IMPORTED_MODULE_5__["Readers"][reader](configuration, supplements));
+ });
- for (i = 0; i < counters.length; i++) {
- if (counters[i] < minWidth && counters[i] > current) {
- minWidth = counters[i];
- }
+ if (true) {
+ var _console;
+
+ (_console = console).log.apply(_console, ['Registered Readers:'].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this._barcodeReaders.map(function (_ref) {
+ var config = _ref.config,
+ FORMAT = _ref.FORMAT;
+ return JSON.stringify({
+ config: config,
+ FORMAT: FORMAT
+ });
+ }))));
+ }
}
+ /**
+ * extend the line on both ends
+ * @param line
+ * @param angle
+ */
- return minWidth;
-};
+ }, {
+ key: "_getExtendedLine",
+ value: function _getExtendedLine(line, angle) {
+ function extendLine(amount) {
+ var extension = {
+ y: amount * Math.sin(angle),
+ x: amount * Math.cos(angle)
+ };
+ line[0].y -= extension.y;
+ line[0].x -= extension.x;
+ line[1].y += extension.y;
+ line[1].x += extension.x;
+ }
-Code39Reader.prototype._toPattern = function (counters) {
- var numCounters = counters.length,
- maxNarrowWidth = 0,
- numWideBars = numCounters,
- wideBarWidth = 0,
- self = this,
- pattern,
- i;
-
- while (numWideBars > 3) {
- maxNarrowWidth = self._findNextWidth(counters, maxNarrowWidth);
- numWideBars = 0;
- pattern = 0;
- for (i = 0; i < numCounters; i++) {
- if (counters[i] > maxNarrowWidth) {
- pattern |= 1 << numCounters - 1 - i;
- numWideBars++;
- wideBarWidth += counters[i];
- }
- }
+ var lineLength = Math.sqrt(Math.pow(line[1].y - line[0].y, 2) + Math.pow(line[1].x - line[0].x, 2));
+ var extensionLength = lineLength * 0.1 | 0;
+ extendLine(extensionLength); // check if inside image
- if (numWideBars === 3) {
- for (i = 0; i < numCounters && numWideBars > 0; i++) {
- if (counters[i] > maxNarrowWidth) {
- numWideBars--;
- if (counters[i] * 2 >= wideBarWidth) {
- return -1;
- }
- }
- }
- return pattern;
- }
+ while (extensionLength > 1 && (!this._inputImageWrapper.inImageWithBorder(line[0], 0) || !this._inputImageWrapper.inImageWithBorder(line[1], 0))) {
+ extensionLength >>= 1;
+ extendLine(-extensionLength);
+ }
+
+ return line;
+ }
+ }, {
+ key: "_getLine",
+ value: function _getLine(box) {
+ return [{
+ x: (box[1].x + box[0].x) / 2,
+ y: (box[1].y + box[0].y) / 2
+ }, {
+ x: (box[3].x + box[2].x) / 2,
+ y: (box[3].y + box[2].y) / 2
+ }];
+ }
+ }, {
+ key: "_tryDecode",
+ value: function _tryDecode(line) {
+ var debug = true && this._config.debug;
+
+ if (debug && this._overlayContext) {
+ this._drawPath(line, 'red', 3);
+ }
+
+ var barcodeLine = _bresenham__WEBPACK_IMPORTED_MODULE_6__["Bresenham"].getBarcodeLine(this._inputImageWrapper, line[0], line[1]);
+
+ if (debug && debug.showFrequency) {
+ this._printFrequency(barcodeLine.line);
+ }
+
+ barcodeLine = _bresenham__WEBPACK_IMPORTED_MODULE_6__["Bresenham"].toBinaryLine(barcodeLine);
+
+ if (debug && debug.showPattern) {
+ this._printPattern(barcodeLine.line);
+ }
+
+ var codeResult = null;
+
+ this._barcodeReaders.some(function (reader) {
+ return !!(codeResult = reader.decodePattern(barcodeLine.line));
+ });
+
+ return codeResult ? {
+ codeResult: codeResult,
+ barcodeLine: barcodeLine
+ } : null;
}
- return -1;
-};
+ /**
+ * This method slices the given area apart and tries to detect a barcode-pattern for each slice.
+ * It returns the decoded barcode, or null if nothing was found
+ * @param box
+ * @param line
+ * @param lineAngle
+ */
-Code39Reader.prototype._findStart = function () {
- var self = this,
- offset = self._nextSet(self._row),
- patternStart = offset,
- counter = [0, 0, 0, 0, 0, 0, 0, 0, 0],
- counterPos = 0,
- isWhite = false,
- i,
- j,
- whiteSpaceMustStart;
-
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- // find start pattern
- if (self._toPattern(counter) === self.ASTERISK) {
- whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4));
- if (self._matchRange(whiteSpaceMustStart, patternStart, 0)) {
- return {
- start: patternStart,
- end: i
- };
- }
- }
+ }, {
+ key: "_tryDecodeBruteForce",
+ value: function _tryDecodeBruteForce(box, line, lineAngle) {
+ var sideLength = Math.sqrt(Math.pow(box[1].x - box[0].x, 2) + Math.pow(box[1].y - box[0].y, 2));
+ var slices = 16;
+ var xdir = Math.sin(lineAngle);
+ var ydir = Math.cos(lineAngle);
- patternStart += counter[0] + counter[1];
- for (j = 0; j < 7; j++) {
- counter[j] = counter[j + 2];
- }
- counter[7] = 0;
- counter[8] = 0;
- counterPos--;
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
+ for (var i = 1; i < slices; i++) {
+ // move line perpendicular to angle
+ var dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1);
+ line[0].y += dir * xdir;
+ line[0].x -= dir * ydir;
+ line[1].y += dir * xdir;
+ line[1].x -= dir * ydir;
+
+ var result = this._tryDecode(line);
+
+ if (result) {
+ return result;
}
- }
- return null;
-};
+ }
-/* harmony default export */ __webpack_exports__["a"] = Code39Reader;
+ return null;
+ }
+ /**
+ * Used for development only
+ */
-/***/ }),
-/* 32 */
-/***/ (function(module, exports) {
+ }, {
+ key: "_printFrequency",
+ value: function _printFrequency(line) {
+ var context = this._frequencyCanvas.getContext('2d');
-module.exports = dot
+ this._frequencyCanvas.width = line.length;
+ this._frequencyCanvas.height = 256;
+ context.beginPath();
+ context.strokeStyle = 'blue';
-/**
- * Calculates the dot product of two vec2's
- *
- * @param {vec2} a the first operand
- * @param {vec2} b the second operand
- * @returns {Number} dot product of a and b
- */
-function dot(a, b) {
- return a[0] * b[0] + a[1] * b[1]
-}
+ for (var i = 0; i < line.length; i++) {
+ context.moveTo(i, 255);
+ context.lineTo(i, 255 - line[i]);
+ }
-/***/ }),
-/* 33 */
-/***/ (function(module, exports, __webpack_require__) {
+ context.closePath();
+ context.stroke();
+ }
+ /**
+ * Used for development only
+ */
-var getNative = __webpack_require__(22),
- root = __webpack_require__(5);
+ }, {
+ key: "_printPattern",
+ value: function _printPattern(line) {
+ var context = this._patternCanvas.getContext('2d');
-/* Built-in method references that are verified to be native. */
-var Map = getNative(root, 'Map');
+ this._patternCanvas.width = line.length;
+ context.fillStyle = 'black';
-module.exports = Map;
+ for (var i = 0; i < line.length; i++) {
+ if (line[i] === 1) {
+ context.fillRect(i, 0, 1, 100);
+ }
+ }
+ }
+ }, {
+ key: "_drawPath",
+ value: function _drawPath(path, color, lineWidth) {
+ _common_image_debug__WEBPACK_IMPORTED_MODULE_7__["ImageDebug"].drawPath(path, this._overlayContext, color, lineWidth);
+ }
+ }]);
+ return BarcodeDecoder;
+}();
/***/ }),
-/* 34 */
-/***/ (function(module, exports, __webpack_require__) {
-var mapCacheClear = __webpack_require__(138),
- mapCacheDelete = __webpack_require__(139),
- mapCacheGet = __webpack_require__(140),
- mapCacheHas = __webpack_require__(141),
- mapCacheSet = __webpack_require__(142);
+/***/ "./src/decoder/bresenham.ts":
+/*!**********************************!*\
+ !*** ./src/decoder/bresenham.ts ***!
+ \**********************************/
+/*! exports provided: Bresenham */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function MapCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
-}
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bresenham", function() { return Bresenham; });
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
-// Add methods to `MapCache`.
-MapCache.prototype.clear = mapCacheClear;
-MapCache.prototype['delete'] = mapCacheDelete;
-MapCache.prototype.get = mapCacheGet;
-MapCache.prototype.has = mapCacheHas;
-MapCache.prototype.set = mapCacheSet;
-module.exports = MapCache;
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-/***/ }),
-/* 35 */
-/***/ (function(module, exports, __webpack_require__) {
+var Slope;
-var baseAssignValue = __webpack_require__(21),
- eq = __webpack_require__(17);
+(function (Slope) {
+ Slope[Slope["Up"] = 1] = "Up";
+ Slope[Slope["Down"] = -1] = "Down";
+})(Slope || (Slope = {}));
-/**
- * This function is like `assignValue` except that it doesn't assign
- * `undefined` values.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
-function assignMergeValue(object, key, value) {
- if ((value !== undefined && !eq(object[key], value)) ||
- (value === undefined && !(key in object))) {
- baseAssignValue(object, key, value);
- }
-}
+;
+var Bresenham = {
+ /**
+ * Scans a line of the given image from point p1 to p2 and returns a result object containing
+ * gray-scale values (0-255) of the underlying pixels in addition to the min and max values.
+ * @param imageWrapper
+ * @param p1 The start point {x,y}
+ * @param p2 The end point {x,y}
+ * @returns {line, min, max}
+ */
+ getBarcodeLine: function getBarcodeLine(imageWrapper, p1, p2) {
+ var x0 = p1.x | 0;
+ var y0 = p1.y | 0;
+ var x1 = p2.x | 0;
+ var y1 = p2.y | 0;
+ var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
+ var tmp;
+ var line = [];
+ var imageData = imageWrapper.data;
+ var width = imageWrapper.size.x;
+ var val;
+ var min = 255;
+ var max = 0;
-module.exports = assignMergeValue;
+ function read(a, b) {
+ val = imageData[b * width + a];
+ min = val < min ? val : min;
+ max = val > max ? val : max;
+ line.push(val);
+ }
+ if (steep) {
+ tmp = x0;
+ x0 = y0;
+ y0 = tmp;
+ tmp = x1;
+ x1 = y1;
+ y1 = tmp;
+ }
-/***/ }),
-/* 36 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (x0 > x1) {
+ tmp = x0;
+ x0 = x1;
+ x1 = tmp;
+ tmp = y0;
+ y0 = y1;
+ y1 = tmp;
+ }
+
+ var deltax = x1 - x0;
+ var deltay = Math.abs(y1 - y0);
+ var error = deltax / 2 | 0;
+ var y = y0;
+ var ystep = y0 < y1 ? 1 : -1;
+
+ for (var x = x0; x < x1; x++) {
+ if (steep) {
+ read(y, x);
+ } else {
+ read(x, y);
+ }
-var baseAssignValue = __webpack_require__(21),
- eq = __webpack_require__(17);
+ error = error - deltay;
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ if (error < 0) {
+ y += ystep;
+ error = error + deltax;
+ }
+ }
+
+ return {
+ line: line,
+ min: min,
+ max: max
+ };
+ },
+
+ /**
+ * Converts the result from getBarcodeLine into a binary representation
+ * also considering the frequency and slope of the signal for more robust results
+ * @param result {line, min, max}
+ */
+ toBinaryLine: function toBinaryLine(result) {
+ var min = result.min;
+ var max = result.max;
+ var line = result.line;
+ var center = min + (max - min) / 2;
+ var extrema = new Array();
+ var threshold = (max - min) / 12;
+ var rThreshold = -threshold; // 1. find extrema
+
+ var currentDir = line[0] > center ? Slope.Up : Slope.Down;
+ extrema.push({
+ pos: 0,
+ val: line[0]
+ });
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ for (var i = 0; i < line.length - 2; i++) {
+ var slope = line[i + 1] - line[i];
+ var slope2 = line[i + 2] - line[i + 1];
+ var dir = void 0;
-/**
- * Assigns `value` to `key` of `object` if the existing value is not equivalent
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
-function assignValue(object, key, value) {
- var objValue = object[key];
- if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
- (value === undefined && !(key in object))) {
- baseAssignValue(object, key, value);
- }
-}
+ if (slope + slope2 < rThreshold && line[i + 1] < center * 1.5) {
+ dir = Slope.Down;
+ } else if (slope + slope2 > threshold && line[i + 1] > center * 0.5) {
+ dir = Slope.Up;
+ } else {
+ dir = currentDir;
+ }
-module.exports = assignValue;
+ if (currentDir !== dir) {
+ extrema.push({
+ pos: i,
+ val: line[i]
+ });
+ currentDir = dir;
+ }
+ }
+ extrema.push({
+ pos: line.length,
+ val: line[line.length - 1]
+ });
-/***/ }),
-/* 37 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var j = extrema[0].pos; j < extrema[1].pos; j++) {
+ line[j] = line[j] > center ? 0 : 1;
+ } // iterate over extrema and convert to binary based on avg between minmax
-var getNative = __webpack_require__(22);
-var defineProperty = (function() {
- try {
- var func = getNative(Object, 'defineProperty');
- func({}, '', {});
- return func;
- } catch (e) {}
-}());
+ for (var _i = 1; _i < extrema.length - 1; _i++) {
+ if (extrema[_i + 1].val > extrema[_i].val) {
+ threshold = extrema[_i].val + (extrema[_i + 1].val - extrema[_i].val) / 3 * 2 | 0;
+ } else {
+ threshold = extrema[_i + 1].val + (extrema[_i].val - extrema[_i + 1].val) / 3 | 0;
+ }
-module.exports = defineProperty;
+ for (var _j = extrema[_i].pos; _j < extrema[_i + 1].pos; _j++) {
+ line[_j] = line[_j] > threshold ? 0 : 1;
+ }
+ }
+ return _objectSpread({}, result, {
+ threshold: threshold
+ });
+ }
+};
/***/ }),
-/* 38 */
-/***/ (function(module, exports, __webpack_require__) {
-/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+/***/ "./src/input/camera-access.ts":
+/*!************************************!*\
+ !*** ./src/input/camera-access.ts ***!
+ \************************************/
+/*! exports provided: CameraAccess */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-module.exports = freeGlobal;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CameraAccess", function() { return CameraAccess; });
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../../node_modules/@babel/runtime/regenerator/index.js");
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../../node_modules/@babel/runtime/helpers/asyncToGenerator.js");
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _common_media_devices__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/media-devices */ "./src/common/media-devices.ts");
+
+
+
+
+var _stream;
+
+var CameraAccess = {
+ /**
+ * Attempts to attach the camera-stream to a given video element
+ * and calls the callback function when the content is ready
+ * @param video
+ * @param videoConstraints
+ */
+ request: function () {
+ var _request = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(video, videoConstraints) {
+ var normalizedConstraints;
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ normalizedConstraints = CameraAccess.pickConstraints(videoConstraints);
+ _context.next = 3;
+ return Object(_common_media_devices__WEBPACK_IMPORTED_MODULE_2__["getUserMedia"])(normalizedConstraints);
+
+ case 3:
+ _stream = _context.sent;
+ video.srcObject = _stream;
+ video.setAttribute('autoplay', '');
+ video.setAttribute('muted', '');
+ video.setAttribute('playsinline', '');
+ return _context.abrupt("return", new Promise(function (resolve) {
+ return video.addEventListener('loadedmetadata', function () {
+ video.play();
+ resolve();
+ });
+ }).then(_waitForVideo.bind(null, video)));
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(47)))
+ case 9:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee);
+ }));
-/***/ }),
-/* 39 */
-/***/ (function(module, exports, __webpack_require__) {
+ function request(_x, _x2) {
+ return _request.apply(this, arguments);
+ }
-var overArg = __webpack_require__(147);
+ return request;
+ }(),
+ release: function release() {
+ var tracks = _stream && _stream.getVideoTracks();
-/** Built-in value references. */
-var getPrototype = overArg(Object.getPrototypeOf, Object);
+ if (tracks && tracks.length) {
+ tracks[0].stop();
+ }
-module.exports = getPrototype;
+ _stream = null;
+ },
+ enumerateVideoDevices: function () {
+ var _enumerateVideoDevices = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2() {
+ var devices;
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ _context2.next = 2;
+ return Object(_common_media_devices__WEBPACK_IMPORTED_MODULE_2__["enumerateDevices"])();
+ case 2:
+ devices = _context2.sent;
+ return _context2.abrupt("return", devices.filter(function (_ref) {
+ var kind = _ref.kind;
+ return kind === 'videoinput';
+ }));
-/***/ }),
-/* 40 */
-/***/ (function(module, exports) {
+ case 4:
+ case "end":
+ return _context2.stop();
+ }
+ }
+ }, _callee2);
+ }));
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ function enumerateVideoDevices() {
+ return _enumerateVideoDevices.apply(this, arguments);
+ }
-/**
- * Checks if `value` is likely a prototype object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
- */
-function isPrototype(value) {
- var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+ return enumerateVideoDevices;
+ }(),
+ getActiveStreamLabel: function getActiveStreamLabel() {
+ var track = CameraAccess.getActiveTrack();
+ return track ? track.label : '';
+ },
+ getActiveTrack: function getActiveTrack() {
+ var tracks = _stream && _stream.getVideoTracks();
- return value === proto;
-}
+ if (tracks && tracks.length) {
+ return tracks[0];
+ }
-module.exports = isPrototype;
+ return null;
+ },
+ pickConstraints: function pickConstraints(videoConstraints) {
+ var width = videoConstraints.width,
+ height = videoConstraints.height,
+ facingMode = videoConstraints.facingMode,
+ aspectRatio = videoConstraints.aspectRatio,
+ deviceId = videoConstraints.deviceId;
+ var _ref2 = videoConstraints,
+ minAspectRatio = _ref2.minAspectRatio,
+ facing = _ref2.facing;
+
+ if (typeof minAspectRatio !== 'undefined' && minAspectRatio > 0) {
+ aspectRatio = minAspectRatio;
+ console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead");
+ }
+
+ if (typeof facing !== 'undefined') {
+ facingMode = facing;
+ console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'");
+ }
+
+ var normalizedConstraints = deviceId && facingMode ? {
+ width: width,
+ height: height,
+ aspectRatio: aspectRatio,
+ deviceId: deviceId
+ } : {
+ width: width,
+ height: height,
+ facingMode: facingMode,
+ aspectRatio: aspectRatio,
+ deviceId: deviceId
+ };
+ return {
+ audio: false,
+ video: normalizedConstraints
+ };
+ }
+};
+function _waitForVideo(_ref3) {
+ var videoWidth = _ref3.videoWidth,
+ videoHeight = _ref3.videoHeight;
+ return new Promise(function (resolve, reject) {
+ var attempts = 10;
-/***/ }),
-/* 41 */
-/***/ (function(module, exports, __webpack_require__) {
+ function checkVideo() {
+ if (attempts > 0) {
+ if (videoWidth > 10 && videoHeight > 10) {
+ if (true) {
+ console.log("".concat(videoWidth, "px x ").concat(videoHeight, "px"));
+ }
-var apply = __webpack_require__(87);
+ resolve();
+ } else {
+ window.setTimeout(checkVideo, 500);
+ }
+ } else {
+ reject('Unable to play video stream. Is webcam working?');
+ }
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
+ attempts--;
+ }
-/**
- * A specialized version of `baseRest` which transforms the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @param {Function} transform The rest array transform.
- * @returns {Function} Returns the new function.
- */
-function overRest(func, start, transform) {
- start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
- }
- index = -1;
- var otherArgs = Array(start + 1);
- while (++index < start) {
- otherArgs[index] = args[index];
- }
- otherArgs[start] = transform(array);
- return apply(func, this, otherArgs);
- };
+ checkVideo();
+ });
}
-module.exports = overRest;
+/***/ }),
+/***/ "./src/input/exif-helper.ts":
+/*!**********************************!*\
+ !*** ./src/input/exif-helper.ts ***!
+ \**********************************/
+/*! exports provided: AvailableTags, findTagsInObjectURL, findTagsInBuffer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvailableTags", function() { return AvailableTags; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findTagsInObjectURL", function() { return findTagsInObjectURL; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findTagsInBuffer", function() { return findTagsInBuffer; });
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../../node_modules/@babel/runtime/regenerator/index.js");
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../../node_modules/@babel/runtime/helpers/asyncToGenerator.js");
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
-/***/ }),
-/* 42 */
-/***/ (function(module, exports, __webpack_require__) {
-var baseSetToString = __webpack_require__(106),
- shortOut = __webpack_require__(148);
/**
- * Sets the `toString` method of `func` to return `string`.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
+ * @borrows https://github.com/exif-js/exif-js
*/
-var setToString = shortOut(baseSetToString);
+var ExifTags = {
+ 0x0112: 'orientation'
+};
+var AvailableTags = Object.keys(ExifTags).map(function (key) {
+ return ExifTags[key];
+});
+function findTagsInObjectURL(_x) {
+ return _findTagsInObjectURL.apply(this, arguments);
+}
+
+function _findTagsInObjectURL() {
+ _findTagsInObjectURL = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(src) {
+ var tags,
+ buffer,
+ _args = arguments;
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ tags = _args.length > 1 && _args[1] !== undefined ? _args[1] : AvailableTags;
+
+ if (!/^blob:/i.test(src)) {
+ _context.next = 6;
+ break;
+ }
-module.exports = setToString;
+ _context.next = 4;
+ return objectURLToBlob(src);
+ case 4:
+ buffer = _context.sent;
+ return _context.abrupt("return", findTagsInBuffer(buffer, tags));
-/***/ }),
-/* 43 */
-/***/ (function(module, exports) {
+ case 6:
+ return _context.abrupt("return", Promise.resolve(null));
-/**
- * This method returns the first argument it receives.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Util
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'a': 1 };
- *
- * console.log(_.identity(object) === object);
- * // => true
- */
-function identity(value) {
- return value;
+ case 7:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee);
+ }));
+ return _findTagsInObjectURL.apply(this, arguments);
}
-module.exports = identity;
+function findTagsInBuffer(file) {
+ var selectedTags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags;
+ var dataView = new DataView(file);
+ var length = file.byteLength;
+ var exifTags = selectedTags.reduce(function (result, selectedTag) {
+ var exifTag = Object.keys(ExifTags).find(function (tag) {
+ return ExifTags[tag] === selectedTag;
+ });
+
+ if (exifTag) {
+ result[exifTag] = selectedTag;
+ }
+ return result;
+ }, {});
+ var offset = 2;
-/***/ }),
-/* 44 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (dataView.getUint8(0) !== 0xFF || dataView.getUint8(1) !== 0xD8) {
+ return null;
+ }
-/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(5),
- stubFalse = __webpack_require__(163);
+ while (offset < length) {
+ if (dataView.getUint8(offset) !== 0xFF) {
+ return null;
+ }
-/** Detect free variable `exports`. */
-var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+ var marker = dataView.getUint8(offset + 1);
-/** Detect free variable `module`. */
-var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+ if (marker === 0xE1) {
+ return readEXIFData(dataView, offset + 4, exifTags);
+ } else {
+ offset += 2 + dataView.getUint16(offset + 2);
+ }
+ }
-/** Detect the popular CommonJS extension `module.exports`. */
-var moduleExports = freeModule && freeModule.exports === freeExports;
+ return null;
+}
-/** Built-in value references. */
-var Buffer = moduleExports ? root.Buffer : undefined;
+function objectURLToBlob(_x2) {
+ return _objectURLToBlob.apply(this, arguments);
+}
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
+function _objectURLToBlob() {
+ _objectURLToBlob = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(url) {
+ var response;
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ _context2.next = 2;
+ return fetch(url);
-/**
- * Checks if `value` is a buffer.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
- * @example
- *
- * _.isBuffer(new Buffer(2));
- * // => true
- *
- * _.isBuffer(new Uint8Array(2));
- * // => false
- */
-var isBuffer = nativeIsBuffer || stubFalse;
+ case 2:
+ response = _context2.sent;
-module.exports = isBuffer;
+ if (!response.ok) {
+ _context2.next = 5;
+ break;
+ }
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(29)(module)))
+ return _context2.abrupt("return", response.arrayBuffer());
-/***/ }),
-/* 45 */
-/***/ (function(module, exports, __webpack_require__) {
+ case 5:
+ throw new Error('HTTP Error ' + response.status);
-var baseIsTypedArray = __webpack_require__(98),
- baseUnary = __webpack_require__(109),
- nodeUtil = __webpack_require__(145);
+ case 6:
+ case "end":
+ return _context2.stop();
+ }
+ }
+ }, _callee2);
+ }));
+ return _objectURLToBlob.apply(this, arguments);
+}
-/* Node.js helper references. */
-var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+function readEXIFData(dataView, start, exifTags) {
+ if ('Exif'.split('').some(function (_char, index) {
+ return dataView.getUint8(start + index) !== _char.charCodeAt(0);
+ })) {
+ return null;
+ }
-/**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
-var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+ var tiffOffset = start + 6;
+ var bigEnd;
-module.exports = isTypedArray;
+ if (dataView.getUint16(tiffOffset) === 0x4949) {
+ bigEnd = false;
+ } else if (dataView.getUint16(tiffOffset) === 0x4D4D) {
+ bigEnd = true;
+ } else {
+ return null;
+ }
+ if (dataView.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) {
+ return null;
+ }
-/***/ }),
-/* 46 */
-/***/ (function(module, exports, __webpack_require__) {
+ var firstIFDOffset = dataView.getUint32(tiffOffset + 4, !bigEnd);
-var arrayLikeKeys = __webpack_require__(88),
- baseKeysIn = __webpack_require__(99),
- isArrayLike = __webpack_require__(24);
+ if (firstIFDOffset < 0x00000008) {
+ return null;
+ }
-/**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
-function keysIn(object) {
- return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+ var tags = readTags(dataView, tiffOffset + firstIFDOffset, exifTags, bigEnd);
+ return tags;
}
-module.exports = keysIn;
+function readTags(dataView, dirStart, strings, bigEnd) {
+ var entries = dataView.getUint16(dirStart, !bigEnd);
+ var tags = {};
+ for (var i = 0; i < entries; i++) {
+ var entryOffset = dirStart + i * 12 + 2;
+ var tag = strings[dataView.getUint16(entryOffset, !bigEnd)];
-/***/ }),
-/* 47 */
-/***/ (function(module, exports) {
+ if (tag) {
+ tags[tag] = readTagValue(dataView, entryOffset, bigEnd);
+ }
+ }
-var g;
-
-// This works in non-strict mode
-g = (function() {
- return this;
-})();
-
-try {
- // This works if eval is allowed (see CSP)
- g = g || Function("return this")() || (1,eval)("this");
-} catch(e) {
- // This works if the window reference is available
- if(typeof window === "object")
- g = window;
-}
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
-module.exports = g;
+ return tags;
+}
+function readTagValue(dataView, entryOffset, bigEnd) {
+ var type = dataView.getUint16(entryOffset + 2, !bigEnd);
+ var numValues = dataView.getUint32(entryOffset + 4, !bigEnd);
+ return type === 3 && numValues === 1 ? dataView.getUint16(entryOffset + 8, !bigEnd) : undefined;
+}
/***/ }),
-/* 48 */
+
+/***/ "./src/input/frame-grabber.ts":
+/*!************************************!*\
+ !*** ./src/input/frame-grabber.ts ***!
+ \************************************/
+/*! exports provided: FrameGrabber */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge__ = __webpack_require__(28);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_merge__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_typedefs__ = __webpack_require__(54);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_typedefs___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__common_typedefs__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__common_image_wrapper__ = __webpack_require__(20);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__locator_barcode_locator__ = __webpack_require__(64);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decoder_barcode_decoder__ = __webpack_require__(57);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__common_events__ = __webpack_require__(51);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__input_camera_access__ = __webpack_require__(59);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__common_image_debug__ = __webpack_require__(9);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__analytics_result_collector__ = __webpack_require__(49);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__config_config__ = __webpack_require__(56);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10_input_stream__ = __webpack_require__(63);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_frame_grabber__ = __webpack_require__(61);
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FrameGrabber", function() { return FrameGrabber; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
- // eslint-disable-line no-unused-vars
+var QUATER_CIRCLE = Math.PI / 2;
+var FrameGrabber =
+/*#__PURE__*/
+function () {
+ function FrameGrabber(inputStream, canvas) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FrameGrabber);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_inputStream", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_streamConfig", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvas", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_context", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_data", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvasHeight", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvasWidth", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_height", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_width", void 0);
-var vec2 = {
- clone: __webpack_require__(7)
-};
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_topLeft", void 0);
-var _inputStream,
- _framegrabber,
- _stopped,
- _canvasContainer = {
- ctx: {
- image: null,
- overlay: null
- },
- dom: {
- image: null,
- overlay: null
- }
-},
- _inputImageWrapper,
- _boxSize,
- _decoder,
- _workerPool = [],
- _onUIThread = true,
- _resultCollector,
- _config = {};
-
-function initializeData(imageWrapper) {
- initBuffers(imageWrapper);
- _decoder = __WEBPACK_IMPORTED_MODULE_4__decoder_barcode_decoder__["a" /* default */].create(_config.decoder, _inputImageWrapper);
-}
+ this._inputStream = inputStream;
+ this._streamConfig = inputStream.config;
+ this._canvasWidth = inputStream.canvasWidth;
+ this._canvasHeight = inputStream.canvasHeight;
+ this._width = inputStream.width;
+ this._height = inputStream.height;
+ this._topLeft = inputStream.topLeft;
+ this._canvas = canvas || document.createElement('canvas');
+ this._canvas.width = this._canvasWidth;
+ this._canvas.height = this._canvasHeight;
+ this._context = this._canvas.getContext('2d');
+ this._data = new Uint8Array(this._width * this._height);
-function initInputStream(cb) {
- var video;
- if (_config.inputStream.type === "VideoStream") {
- video = document.createElement("video");
- _inputStream = __WEBPACK_IMPORTED_MODULE_10_input_stream__["a" /* default */].createVideoStream(video);
- } else if (_config.inputStream.type === "ImageStream") {
- _inputStream = __WEBPACK_IMPORTED_MODULE_10_input_stream__["a" /* default */].createImageStream();
- } else if (_config.inputStream.type === "LiveStream") {
- var $viewport = getViewPort();
- if ($viewport) {
- video = $viewport.querySelector("video");
- if (!video) {
- video = document.createElement("video");
- $viewport.appendChild(video);
- }
+ if (true) {
+ console.log('FrameGrabber', JSON.stringify({
+ size: {
+ x: this._width,
+ y: this._height
+ },
+ topLeft: this._topLeft,
+ videoSize: {
+ x: inputStream.realWidth,
+ y: inputStream.realHeight
+ },
+ canvasSize: {
+ x: this._canvasWidth,
+ y: this._canvasHeight
}
- _inputStream = __WEBPACK_IMPORTED_MODULE_10_input_stream__["a" /* default */].createLiveStream(video);
- __WEBPACK_IMPORTED_MODULE_6__input_camera_access__["a" /* default */].request(video, _config.inputStream.constraints).then(function () {
- _inputStream.trigger("canrecord");
- }).catch(function (err) {
- return cb(err);
- });
+ }));
}
+ }
+ /**
+ * Fetches a frame from the input stream and puts into the frame buffer.
+ * The image data is converted to gray scale and then half-sampled if configured.
+ */
- _inputStream.setAttribute("preload", "auto");
- _inputStream.setInputStream(_config.inputStream);
- _inputStream.addEventListener("canrecord", canRecord.bind(undefined, cb));
-}
-function getViewPort() {
- var target = _config.inputStream.target;
- // Check if target is already a DOM element
- if (target && target.nodeName && target.nodeType === 1) {
- return target;
- } else {
- // Use '#interactive.viewport' as a fallback selector (backwards compatibility)
- var selector = typeof target === 'string' ? target : '#interactive.viewport';
- return document.querySelector(selector);
- }
-}
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FrameGrabber, [{
+ key: "grab",
+ value: function grab(data) {
+ this._data = data;
-function canRecord(cb) {
- __WEBPACK_IMPORTED_MODULE_3__locator_barcode_locator__["a" /* default */].checkImageConstraints(_inputStream, _config.locator);
- initCanvas(_config);
- _framegrabber = __WEBPACK_IMPORTED_MODULE_11_frame_grabber__["a" /* default */].create(_inputStream, _canvasContainer.dom.image);
+ var frame = this._inputStream.getFrame();
- adjustWorkerPool(_config.numOfWorkers, function () {
- if (_config.numOfWorkers === 0) {
- initializeData();
- }
- ready(cb);
- });
-}
+ if (frame) {
+ this._adjustCanvasSize();
-function ready(cb) {
- _inputStream.play();
- cb();
-}
+ var drawable;
+ var drawAngle = 0;
-function initCanvas() {
- if (typeof document !== "undefined") {
- var $viewport = getViewPort();
- _canvasContainer.dom.image = document.querySelector("canvas.imgBuffer");
- if (!_canvasContainer.dom.image) {
- _canvasContainer.dom.image = document.createElement("canvas");
- _canvasContainer.dom.image.className = "imgBuffer";
- if ($viewport && _config.inputStream.type === "ImageStream") {
- $viewport.appendChild(_canvasContainer.dom.image);
- }
- }
- _canvasContainer.ctx.image = _canvasContainer.dom.image.getContext("2d");
- _canvasContainer.dom.image.width = _inputStream.getCanvasSize().x;
- _canvasContainer.dom.image.height = _inputStream.getCanvasSize().y;
+ if (frame instanceof HTMLVideoElement) {
+ drawable = frame;
+ } else {
+ drawable = frame.image;
+
+ if (frame.tags) {
+ switch (frame.tags.orientation) {
+ case 6:
+ {
+ drawAngle = QUATER_CIRCLE;
+ break;
+ }
- _canvasContainer.dom.overlay = document.querySelector("canvas.drawingBuffer");
- if (!_canvasContainer.dom.overlay) {
- _canvasContainer.dom.overlay = document.createElement("canvas");
- _canvasContainer.dom.overlay.className = "drawingBuffer";
- if ($viewport) {
- $viewport.appendChild(_canvasContainer.dom.overlay);
- }
- var clearFix = document.createElement("br");
- clearFix.setAttribute("clear", "all");
- if ($viewport) {
- $viewport.appendChild(clearFix);
+ case 8:
+ {
+ drawAngle = -QUATER_CIRCLE;
+ break;
+ }
}
+ }
}
- _canvasContainer.ctx.overlay = _canvasContainer.dom.overlay.getContext("2d");
- _canvasContainer.dom.overlay.width = _inputStream.getCanvasSize().x;
- _canvasContainer.dom.overlay.height = _inputStream.getCanvasSize().y;
- }
-}
-function initBuffers(imageWrapper) {
- if (imageWrapper) {
- _inputImageWrapper = imageWrapper;
- } else {
- _inputImageWrapper = new __WEBPACK_IMPORTED_MODULE_2__common_image_wrapper__["a" /* default */]({
- x: _inputStream.getWidth(),
- y: _inputStream.getHeight()
- });
- }
+ if (drawAngle !== 0) {
+ var halfWidth = this._canvasWidth >> 1;
+ var halfHeight = this._canvasHeight >> 1;
- if (true) {
- console.log(_inputImageWrapper.size);
- }
- _boxSize = [vec2.clone([0, 0]), vec2.clone([0, _inputImageWrapper.size.y]), vec2.clone([_inputImageWrapper.size.x, _inputImageWrapper.size.y]), vec2.clone([_inputImageWrapper.size.x, 0])];
- __WEBPACK_IMPORTED_MODULE_3__locator_barcode_locator__["a" /* default */].init(_inputImageWrapper, _config.locator);
-}
+ this._context.translate(halfWidth, halfHeight);
-function getBoundingBoxes() {
- if (_config.locate) {
- return __WEBPACK_IMPORTED_MODULE_3__locator_barcode_locator__["a" /* default */].locate();
- } else {
- return [[vec2.clone(_boxSize[0]), vec2.clone(_boxSize[1]), vec2.clone(_boxSize[2]), vec2.clone(_boxSize[3])]];
- }
-}
+ this._context.rotate(drawAngle);
-function transformResult(result) {
- var topRight = _inputStream.getTopRight(),
- xOffset = topRight.x,
- yOffset = topRight.y,
- i;
+ this._context.drawImage(drawable, -halfHeight, -halfWidth, this._canvasHeight, this._canvasWidth);
- if (xOffset === 0 && yOffset === 0) {
- return;
- }
+ this._context.rotate(-drawAngle);
- if (result.barcodes) {
- for (i = 0; i < result.barcodes.length; i++) {
- transformResult(result.barcodes[i]);
+ this._context.translate(-halfWidth, -halfHeight);
+ } else {
+ this._context.drawImage(drawable, 0, 0, this._canvasWidth, this._canvasHeight);
+ }
+
+ var imageData = this._context.getImageData(this._topLeft.x, this._topLeft.y, this._width, this._height).data;
+
+ if (this._streamConfig.halfSample) {
+ this._grayAndHalfSampleFromCanvasData(imageData);
+ } else {
+ this._computeGray(imageData);
}
- }
- if (result.line && result.line.length === 2) {
- moveLine(result.line);
+ return true;
+ } else {
+ return false;
+ }
}
+ }, {
+ key: "_adjustCanvasSize",
+ value: function _adjustCanvasSize() {
+ if (this._canvas.height !== this._canvasHeight || this._canvas.width !== this._canvasWidth) {
+ if (true) {
+ console.warn('Canvas size needs to be adjusted');
+ }
- if (result.box) {
- moveBox(result.box);
+ this._canvas.height = this._canvasHeight;
+ this._canvas.width = this._canvasWidth;
+ }
}
+ }, {
+ key: "_grayAndHalfSampleFromCanvasData",
+ value: function _grayAndHalfSampleFromCanvasData(imageData) {
+ var endIndex = imageData.length >> 2;
+ var outWidth = this._width >> 1;
+ var topRowIndex = 0;
+ var bottomRowIndex = this._width;
+ var outImageIndex = 0;
- if (result.boxes && result.boxes.length > 0) {
- for (i = 0; i < result.boxes.length; i++) {
- moveBox(result.boxes[i]);
+ while (bottomRowIndex < endIndex) {
+ for (var i = 0; i < outWidth; i++) {
+ var top4 = topRowIndex << 2;
+ var bottom4 = bottomRowIndex << 2;
+ this._data[outImageIndex] = (0.299 * imageData[top4 + 0] + 0.587 * imageData[top4 + 1] + 0.114 * imageData[top4 + 2] + (0.299 * imageData[top4 + 4] + 0.587 * imageData[top4 + 5] + 0.114 * imageData[top4 + 6]) + (0.299 * imageData[bottom4 + 0] + 0.587 * imageData[bottom4 + 1] + 0.114 * imageData[bottom4 + 2]) + (0.299 * imageData[bottom4 + 4] + 0.587 * imageData[bottom4 + 5] + 0.114 * imageData[bottom4 + 6])) / 4 | 0;
+ outImageIndex++;
+ topRowIndex += 2;
+ bottomRowIndex += 2;
}
- }
- function moveBox(box) {
- var corner = box.length;
+ topRowIndex += this._width;
+ bottomRowIndex += this._width;
+ }
+ }
+ }, {
+ key: "_computeGray",
+ value: function _computeGray(imageData) {
+ var imageDataLength = imageData.length;
- while (corner--) {
- box[corner][0] += xOffset;
- box[corner][1] += yOffset;
+ if (this._streamConfig && this._streamConfig.singleChannel) {
+ for (var i = 0, j = 0; i < imageDataLength; i += 4, j++) {
+ this._data[j] = imageData[i];
+ }
+ } else {
+ for (var _i = 0, _j = 0; _i < imageDataLength; _i += 4, _j++) {
+ this._data[_j] = 0.299 * imageData[_i] + 0.587 * imageData[_i + 1] + 0.114 * imageData[_i + 2] | 0;
}
+ }
}
+ }]);
- function moveLine(line) {
- line[0].x += xOffset;
- line[0].y += yOffset;
- line[1].x += xOffset;
- line[1].y += yOffset;
- }
-}
+ return FrameGrabber;
+}();
-function addResult(result, imageData) {
- if (!imageData || !_resultCollector) {
- return;
- }
+/***/ }),
- if (result.barcodes) {
- result.barcodes.filter(function (barcode) {
- return barcode.codeResult;
- }).forEach(function (barcode) {
- return addResult(barcode, imageData);
- });
- } else if (result.codeResult) {
- _resultCollector.addResult(imageData, _inputStream.getCanvasSize(), result.codeResult);
- }
-}
+/***/ "./src/input/image-loader.ts":
+/*!***********************************!*\
+ !*** ./src/input/image-loader.ts ***!
+ \***********************************/
+/*! exports provided: ImageLoader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-function hasCodeResult(result) {
- return result && (result.barcodes ? result.barcodes.some(function (barcode) {
- return barcode.codeResult;
- }) : result.codeResult);
-}
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageLoader", function() { return ImageLoader; });
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../../node_modules/@babel/runtime/regenerator/index.js");
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../../node_modules/@babel/runtime/helpers/asyncToGenerator.js");
+/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _exif_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./exif-helper */ "./src/input/exif-helper.ts");
-function publishResult(result, imageData) {
- var resultToPublish = result;
- if (result && _onUIThread) {
- transformResult(result);
- addResult(result, imageData);
- resultToPublish = result.barcodes || result;
- }
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].publish("processed", resultToPublish);
- if (hasCodeResult(result)) {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].publish("detected", resultToPublish);
- }
-}
-function locateAndDecode() {
- var result, boxes;
- boxes = getBoundingBoxes();
- if (boxes) {
- result = _decoder.decodeFromBoundingBoxes(boxes);
- result = result || {};
- result.boxes = boxes;
- publishResult(result, _inputImageWrapper.data);
- } else {
- publishResult();
- }
-}
+var ImageLoader =
+/*#__PURE__*/
+function () {
+ function ImageLoader() {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, ImageLoader);
+ }
-function update() {
- var availableWorker;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(ImageLoader, null, [{
+ key: "load",
+ value: function () {
+ var _load = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(baseUri, callback, offset, size, sequence) {
+ var imageSrcs, loadedImages, notLoadedImages, i, loaded, _loaded;
+
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ _loaded = function _ref2() {
+ _loaded = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(loadedImage) {
+ var x, y, imageName, firstImage;
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ x = 0;
+
+ case 1:
+ if (!(x < notLoadedImages.length)) {
+ _context.next = 17;
+ break;
+ }
- if (_onUIThread) {
- if (_workerPool.length > 0) {
- availableWorker = _workerPool.filter(function (workerThread) {
- return !workerThread.busy;
- })[0];
- if (availableWorker) {
- _framegrabber.attachData(availableWorker.imageData);
- } else {
- return; // all workers are busy
- }
- } else {
- _framegrabber.attachData(_inputImageWrapper.data);
- }
- if (_framegrabber.grab()) {
- if (availableWorker) {
- availableWorker.busy = true;
- availableWorker.worker.postMessage({
- cmd: 'process',
- imageData: availableWorker.imageData
- }, [availableWorker.imageData.buffer]);
- } else {
- locateAndDecode();
- }
- }
- } else {
- locateAndDecode();
- }
-}
+ if (!(notLoadedImages[x] === loadedImage)) {
+ _context.next = 14;
+ break;
+ }
-function startContinuousUpdate() {
- var next = null,
- delay = 1000 / (_config.frequency || 60);
-
- _stopped = false;
- (function frame(timestamp) {
- next = next || timestamp;
- if (!_stopped) {
- if (timestamp >= next) {
- next += delay;
- update();
- }
- window.requestAnimFrame(frame);
- }
- })(performance.now());
-}
+ notLoadedImages.splice(x, 1); // TODO: assume the index is the same
-function _start() {
- if (_onUIThread && _config.inputStream.type === "LiveStream") {
- startContinuousUpdate();
- } else {
- update();
- }
-}
+ y = 0;
-function initWorker(cb) {
- var blobURL,
- workerThread = {
- worker: undefined,
- imageData: new Uint8Array(_inputStream.getWidth() * _inputStream.getHeight()),
- busy: true
- };
+ case 5:
+ if (!(y < imageSrcs.length)) {
+ _context.next = 13;
+ break;
+ }
- blobURL = generateWorkerBlob();
- workerThread.worker = new Worker(blobURL);
+ imageName = imageSrcs[y].substr(imageSrcs[y].lastIndexOf('/'));
- workerThread.worker.onmessage = function (e) {
- if (e.data.event === 'initialized') {
- URL.revokeObjectURL(blobURL);
- workerThread.busy = false;
- workerThread.imageData = new Uint8Array(e.data.imageData);
- if (true) {
- console.log("Worker initialized");
- }
- return cb(workerThread);
- } else if (e.data.event === 'processed') {
- workerThread.imageData = new Uint8Array(e.data.imageData);
- workerThread.busy = false;
- publishResult(e.data.result, workerThread.imageData);
- } else if (e.data.event === 'error') {
- if (true) {
- console.log("Worker error: " + e.data.message);
- }
- }
- };
+ if (!(loadedImage.src.lastIndexOf(imageName) !== -1)) {
+ _context.next = 10;
+ break;
+ }
- workerThread.worker.postMessage({
- cmd: 'init',
- size: { x: _inputStream.getWidth(), y: _inputStream.getHeight() },
- imageData: workerThread.imageData,
- config: configForWorker(_config)
- }, [workerThread.imageData.buffer]);
-}
+ loadedImages[y] = {
+ image: loadedImage
+ };
+ return _context.abrupt("break", 13);
-function configForWorker(config) {
- return _extends({}, config, {
- inputStream: _extends({}, config.inputStream, {
- target: null
- })
- });
-}
+ case 10:
+ y++;
+ _context.next = 5;
+ break;
-function workerInterface(factory) {
- /* eslint-disable no-undef*/
- if (factory) {
- var Quagga = factory().default;
- if (!Quagga) {
- self.postMessage({ 'event': 'error', message: 'Quagga could not be created' });
- return;
- }
- }
- var imageWrapper;
-
- self.onmessage = function (e) {
- if (e.data.cmd === 'init') {
- var config = e.data.config;
- config.numOfWorkers = 0;
- imageWrapper = new Quagga.ImageWrapper({
- x: e.data.size.x,
- y: e.data.size.y
- }, new Uint8Array(e.data.imageData));
- Quagga.init(config, ready, imageWrapper);
- Quagga.onProcessed(onProcessed);
- } else if (e.data.cmd === 'process') {
- imageWrapper.data = new Uint8Array(e.data.imageData);
- Quagga.start();
- } else if (e.data.cmd === 'setReaders') {
- Quagga.setReaders(e.data.readers);
- }
- };
+ case 13:
+ return _context.abrupt("break", 17);
- function onProcessed(result) {
- self.postMessage({
- 'event': 'processed',
- imageData: imageWrapper.data,
- result: result
- }, [imageWrapper.data.buffer]);
- }
+ case 14:
+ x++;
+ _context.next = 1;
+ break;
- function ready() {
- // eslint-disable-line
- self.postMessage({ 'event': 'initialized', imageData: imageWrapper.data }, [imageWrapper.data.buffer]);
- }
+ case 17:
+ if (!(notLoadedImages.length === 0)) {
+ _context.next = 33;
+ break;
+ }
- /* eslint-enable */
-}
+ if (true) {
+ console.log('Images loaded');
+ }
-function generateWorkerBlob() {
- var blob, factorySource;
+ _context.prev = 19;
- /* jshint ignore:start */
- if (typeof __factorySource__ !== 'undefined') {
- factorySource = __factorySource__; // eslint-disable-line no-undef
- }
- /* jshint ignore:end */
+ if (!(sequence === false)) {
+ _context.next = 25;
+ break;
+ }
- blob = new Blob(['(' + workerInterface.toString() + ')(' + factorySource + ');'], { type: 'text/javascript' });
+ firstImage = loadedImages[0];
+ _context.next = 24;
+ return Object(_exif_helper__WEBPACK_IMPORTED_MODULE_4__["findTagsInObjectURL"])(baseUri);
- return window.URL.createObjectURL(blob);
-}
+ case 24:
+ firstImage.tags = _context.sent;
-function _setReaders(readers) {
- if (_decoder) {
- _decoder.setReaders(readers);
- } else if (_onUIThread && _workerPool.length > 0) {
- _workerPool.forEach(function (workerThread) {
- workerThread.worker.postMessage({ cmd: 'setReaders', readers: readers });
- });
- }
-}
+ case 25:
+ _context.next = 30;
+ break;
-function adjustWorkerPool(capacity, cb) {
- var increaseBy = capacity - _workerPool.length;
- if (increaseBy === 0) {
- return cb && cb();
- }
- if (increaseBy < 0) {
- var workersToTerminate = _workerPool.slice(increaseBy);
- workersToTerminate.forEach(function (workerThread) {
- workerThread.worker.terminate();
- if (true) {
- console.log("Worker terminated!");
- }
- });
- _workerPool = _workerPool.slice(0, increaseBy);
- return cb && cb();
- } else {
- var workerInitialized = function workerInitialized(workerThread) {
- _workerPool.push(workerThread);
- if (_workerPool.length >= capacity) {
- cb && cb();
- }
- };
+ case 27:
+ _context.prev = 27;
+ _context.t0 = _context["catch"](19);
+ console.log(_context.t0);
- for (var i = 0; i < increaseBy; i++) {
- initWorker(workerInitialized);
- }
- }
-}
+ case 30:
+ _context.prev = 30;
+ callback(loadedImages);
+ return _context.finish(30);
-/* harmony default export */ __webpack_exports__["default"] = {
- init: function init(config, cb, imageWrapper) {
- _config = __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default()({}, __WEBPACK_IMPORTED_MODULE_9__config_config__["a" /* default */], config);
- if (imageWrapper) {
- _onUIThread = false;
- initializeData(imageWrapper);
- return cb();
- } else {
- initInputStream(cb);
- }
- },
- start: function start() {
- _start();
- },
- stop: function stop() {
- _stopped = true;
- adjustWorkerPool(0);
- if (_config.inputStream.type === "LiveStream") {
- __WEBPACK_IMPORTED_MODULE_6__input_camera_access__["a" /* default */].release();
- _inputStream.clearEventHandlers();
- }
- },
- pause: function pause() {
- _stopped = true;
- },
- onDetected: function onDetected(callback) {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].subscribe("detected", callback);
- },
- offDetected: function offDetected(callback) {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].unsubscribe("detected", callback);
- },
- onProcessed: function onProcessed(callback) {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].subscribe("processed", callback);
- },
- offProcessed: function offProcessed(callback) {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].unsubscribe("processed", callback);
- },
- setReaders: function setReaders(readers) {
- _setReaders(readers);
- },
- registerResultCollector: function registerResultCollector(resultCollector) {
- if (resultCollector && typeof resultCollector.addResult === 'function') {
- _resultCollector = resultCollector;
- }
- },
- canvas: _canvasContainer,
- decodeSingle: function decodeSingle(config, resultCallback) {
- var _this = this;
-
- config = __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default()({
- inputStream: {
- type: "ImageStream",
- sequence: false,
- size: 800,
- src: config.src
- },
- numOfWorkers: true && config.debug ? 0 : 1,
- locator: {
- halfSample: false
+ case 33:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[19, 27, 30, 33]]);
+ }));
+ return _loaded.apply(this, arguments);
+ };
+
+ loaded = function _ref(_x6) {
+ return _loaded.apply(this, arguments);
+ };
+
+ imageSrcs = new Array(size);
+ loadedImages = new Array(size);
+ notLoadedImages = new Array();
+
+ if (sequence === false) {
+ imageSrcs[0] = baseUri;
+ } else {
+ for (i = 0; i < size; i++) {
+ imageSrcs[i] = "".concat(baseUri, "image-").concat(('00' + (offset + i)).slice(-3), ".jpg");
+ }
+ }
+
+ imageSrcs.forEach(function (src) {
+ var image = new Image();
+ notLoadedImages.push(image);
+
+ image.onload = function () {
+ return loaded(image);
+ };
+
+ image.src = src;
+ });
+
+ case 7:
+ case "end":
+ return _context2.stop();
}
- }, config);
- this.init(config, function () {
- __WEBPACK_IMPORTED_MODULE_5__common_events__["a" /* default */].once("processed", function (result) {
- _this.stop();
- resultCallback.call(null, result);
- }, true);
- _start();
- });
- },
- ImageWrapper: __WEBPACK_IMPORTED_MODULE_2__common_image_wrapper__["a" /* default */],
- ImageDebug: __WEBPACK_IMPORTED_MODULE_7__common_image_debug__["a" /* default */],
- ResultCollector: __WEBPACK_IMPORTED_MODULE_8__analytics_result_collector__["a" /* default */],
- CameraAccess: __WEBPACK_IMPORTED_MODULE_6__input_camera_access__["a" /* default */]
-};
+ }
+ }, _callee2);
+ }));
+
+ function load(_x, _x2, _x3, _x4, _x5) {
+ return _load.apply(this, arguments);
+ }
+
+ return load;
+ }()
+ }]);
+
+ return ImageLoader;
+}();
/***/ }),
-/* 49 */
+
+/***/ "./src/input/image-stream.ts":
+/*!***********************************!*\
+ !*** ./src/input/image-stream.ts ***!
+ \***********************************/
+/*! exports provided: ImageStream */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__common_image_debug__ = __webpack_require__(9);
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageStream", function() { return ImageStream; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _image_loader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./image-loader */ "./src/input/image-loader.ts");
+/* harmony import */ var _input_stream__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input-stream */ "./src/input/input-stream.ts");
-function contains(codeResult, list) {
- if (list) {
- return list.some(function (item) {
- return Object.keys(item).every(function (key) {
- return item[key] === codeResult[key];
- });
- });
- }
- return false;
-}
-function passesFilter(codeResult, filter) {
- if (typeof filter === 'function') {
- return filter(codeResult);
- }
- return true;
-}
-/* harmony default export */ __webpack_exports__["a"] = {
- create: function create(config) {
- var canvas = document.createElement("canvas"),
- ctx = canvas.getContext("2d"),
- results = [],
- capacity = config.capacity || 20,
- capture = config.capture === true;
- function matchesConstraints(codeResult) {
- return capacity && codeResult && !contains(codeResult, config.blacklist) && passesFilter(codeResult, config.filter);
- }
- return {
- addResult: function addResult(data, imageSize, codeResult) {
- var result = {};
-
- if (matchesConstraints(codeResult)) {
- capacity--;
- result.codeResult = codeResult;
- if (capture) {
- canvas.width = imageSize.x;
- canvas.height = imageSize.y;
- __WEBPACK_IMPORTED_MODULE_0__common_image_debug__["a" /* default */].drawImage(data, imageSize, ctx);
- result.frame = canvas.toDataURL();
- }
- results.push(result);
- }
- },
- getResults: function getResults() {
- return results;
- }
- };
- }
-};
-/***/ }),
-/* 50 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-var vec2 = {
- clone: __webpack_require__(7),
- dot: __webpack_require__(32)
-};
-/**
- * Creates a cluster for grouping similar orientations of datapoints
- */
-/* harmony default export */ __webpack_exports__["a"] = {
- create: function create(point, threshold) {
- var points = [],
- center = {
- rad: 0,
- vec: vec2.clone([0, 0])
- },
- pointMap = {};
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
- function init() {
- _add(point);
- updateCenter();
- }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
- function _add(pointToAdd) {
- pointMap[pointToAdd.id] = pointToAdd;
- points.push(pointToAdd);
- }
- function updateCenter() {
- var i,
- sum = 0;
- for (i = 0; i < points.length; i++) {
- sum += points[i].rad;
- }
- center.rad = sum / points.length;
- center.vec = vec2.clone([Math.cos(center.rad), Math.sin(center.rad)]);
- }
- init();
+var ImageStream =
+/*#__PURE__*/
+function (_InputStream) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(ImageStream, _InputStream);
- return {
- add: function add(pointToAdd) {
- if (!pointMap[pointToAdd.id]) {
- _add(pointToAdd);
- updateCenter();
- }
- },
- fits: function fits(otherPoint) {
- // check cosine similarity to center-angle
- var similarity = Math.abs(vec2.dot(otherPoint.point.vec, center.vec));
- if (similarity > threshold) {
- return true;
- }
- return false;
- },
- getPoints: function getPoints() {
- return points;
- },
- getCenter: function getCenter() {
- return center;
- }
- };
- },
- createPoint: function createPoint(newPoint, id, property) {
- return {
- rad: newPoint[property],
- point: newPoint,
- id: id
- };
- }
-};
+ function ImageStream() {
+ var _this;
-/***/ }),
-/* 51 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ImageStream);
-"use strict";
-/* harmony default export */ __webpack_exports__["a"] = (function () {
- var events = {};
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ImageStream).call(this));
- function getEvent(eventName) {
- if (!events[eventName]) {
- events[eventName] = {
- subscribers: []
- };
- }
- return events[eventName];
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_baseUrl", void 0);
- function clearEvents() {
- events = {};
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_ended", void 0);
- function publishSubscription(subscription, data) {
- if (subscription.async) {
- setTimeout(function () {
- subscription.callback(data);
- }, 4);
- } else {
- subscription.callback(data);
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_frameIndex", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_height", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_images", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_loaded", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_offset", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_paused", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_size", void 0);
+
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_width", void 0);
+
+ _this._canvasHeight = 0;
+ _this._canvasWidth = 0;
+ _this._baseUrl = null;
+ _this._ended = false;
+ _this._frameIndex = 0;
+ _this._height = 0;
+ _this._images = null;
+ _this._loaded = false;
+ _this._offset = 1;
+ _this._paused = true;
+ _this._size = 0;
+ _this._width = 0;
+ return _this;
+ }
+
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ImageStream, [{
+ key: "setAttribute",
+ value: function setAttribute() {}
+ }, {
+ key: "pause",
+ value: function pause() {
+ this._paused = true;
+ }
+ }, {
+ key: "play",
+ value: function play() {
+ this._paused = false;
}
+ }, {
+ key: "getFrame",
+ value: function getFrame() {
+ var _this2 = this;
- function _subscribe(event, callback, async) {
- var subscription;
+ var frame = null;
- if (typeof callback === "function") {
- subscription = {
- callback: callback,
- async: async
- };
+ if (this._loaded && !this._paused) {
+ frame = this._images[this._frameIndex];
+
+ if (this._frameIndex < this._size - 1) {
+ this._frameIndex++;
} else {
- subscription = callback;
- if (!subscription.callback) {
- throw "Callback was not specified on options";
- }
+ setTimeout(function () {
+ _this2._ended = true;
+
+ _this2.trigger('ended', []);
+ }, 0);
}
+ }
- getEvent(event).subscribers.push(subscription);
+ return frame;
}
+ }, {
+ key: "_loadImages",
+ value: function _loadImages() {
+ var _this3 = this;
- return {
- subscribe: function subscribe(event, callback, async) {
- return _subscribe(event, callback, async);
- },
- publish: function publish(eventName, data) {
- var event = getEvent(eventName),
- subscribers = event.subscribers;
-
- // Publish one-time subscriptions
- subscribers.filter(function (subscriber) {
- return !!subscriber.once;
- }).forEach(function (subscriber) {
- publishSubscription(subscriber, data);
- });
+ this._loaded = false;
+ _image_loader__WEBPACK_IMPORTED_MODULE_7__["ImageLoader"].load(this._baseUrl, function (images) {
+ _this3._images = images;
- // remove them from the subscriber
- event.subscribers = subscribers.filter(function (subscriber) {
- return !subscriber.once;
- });
+ switch (images[0].tags && images[0].tags.orientation) {
+ case 6:
+ case 8:
+ {
+ _this3._width = images[0].image.height;
+ _this3._height = images[0].image.width;
+ break;
+ }
- // publish the rest
- event.subscribers.forEach(function (subscriber) {
- publishSubscription(subscriber, data);
- });
- },
- once: function once(event, callback, async) {
- _subscribe(event, {
- callback: callback,
- async: async,
- once: true
- });
- },
- unsubscribe: function unsubscribe(eventName, callback) {
- var event;
-
- if (eventName) {
- event = getEvent(eventName);
- if (event && callback) {
- event.subscribers = event.subscribers.filter(function (subscriber) {
- return subscriber.callback !== callback;
- });
- } else {
- event.subscribers = [];
- }
- } else {
- clearEvents();
+ default:
+ {
+ _this3._width = images[0].image.width;
+ _this3._height = images[0].image.height;
}
}
- };
-})();
-
-/***/ }),
-/* 52 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony export (immutable) */ __webpack_exports__["b"] = enumerateDevices;
-/* harmony export (immutable) */ __webpack_exports__["a"] = getUserMedia;
+ _this3._canvasWidth = _this3._calculatedWidth = _this3._config.size ? _this3._width > _this3._height ? _this3._config.size : _this3._width * _this3._config.size / _this3._height | 0 : _this3._width;
+ _this3._canvasHeight = _this3._calculatedHeight = _this3._config.size ? _this3._width > _this3._height ? _this3._height * _this3._config.size / _this3._width | 0 : _this3._config.size : _this3._height;
+ _this3._loaded = true;
+ _this3._frameIndex = 0;
+ setTimeout(function () {
+ return _this3.trigger('canrecord', []);
+ }, 0);
+ }, this._offset, this._size, this._config.sequence);
+ }
+ }, {
+ key: "realHeight",
+ get: function get() {
+ return this._height;
+ }
+ }, {
+ key: "realWidth",
+ get: function get() {
+ return this._width;
+ }
+ }, {
+ key: "config",
+ get: function get() {
+ return this._config;
+ },
+ set: function set(config) {
+ this._config = _objectSpread({}, config);
+ this._baseUrl = config.src;
+ this._size = config.sequence && config.length ? config.length : 1;
-function enumerateDevices() {
- if (navigator.mediaDevices && typeof navigator.mediaDevices.enumerateDevices === 'function') {
- return navigator.mediaDevices.enumerateDevices();
+ this._loadImages();
}
- return Promise.reject(new Error('enumerateDevices is not defined'));
-};
-
-function getUserMedia(constraints) {
- if (navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === 'function') {
- return navigator.mediaDevices.getUserMedia(constraints);
+ }, {
+ key: "ended",
+ get: function get() {
+ return this._ended;
}
- return Promise.reject(new Error('getUserMedia is not defined'));
-}
+ }, {
+ key: "currentTime",
+ set: function set(time) {
+ this._frameIndex = time;
+ }
+ }]);
+
+ return ImageStream;
+}(_input_stream__WEBPACK_IMPORTED_MODULE_8__["InputStream"]);
/***/ }),
-/* 53 */
+
+/***/ "./src/input/input-stream-utils.ts":
+/*!*****************************************!*\
+ !*** ./src/input/input-stream-utils.ts ***!
+ \*****************************************/
+/*! exports provided: calculatePatchSize, checkImageConstraints, _parseCssDimensionValues, _dimensionsConverters, computeImageArea */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/**
- * Construct representing a part of another {ImageWrapper}. Shares data
- * between the parent and the child.
- * @param from {ImageRef} The position where to start the {SubImage} from. (top-left corner)
- * @param size {ImageRef} The size of the resulting image
- * @param I {ImageWrapper} The {ImageWrapper} to share from
- * @returns {SubImage} A shared part of the original image
- */
-function SubImage(from, size, I) {
- if (!I) {
- I = {
- data: null,
- size: size
- };
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculatePatchSize", function() { return calculatePatchSize; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkImageConstraints", function() { return checkImageConstraints; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_parseCssDimensionValues", function() { return _parseCssDimensionValues; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_dimensionsConverters", function() { return _dimensionsConverters; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeImageArea", function() { return computeImageArea; });
+function _computeDivisors(n) {
+ var divisors = new Array();
+ var largeDivisors = new Array();
+
+ for (var divisor = 1; divisor * divisor <= n; divisor++) {
+ if (n % divisor === 0) {
+ divisors.push(divisor);
+
+ if (divisor * divisor !== n) {
+ largeDivisors.unshift(n / divisor | 0);
+ }
}
- this.data = I.data;
- this.originalSize = I.size;
- this.I = I;
+ }
- this.from = from;
- this.size = size;
+ return divisors.concat(largeDivisors);
}
-/**
- * Displays the {SubImage} in a given canvas
- * @param canvas {Canvas} The canvas element to write to
- * @param scale {Number} Scale which is applied to each pixel-value
- */
-SubImage.prototype.show = function (canvas, scale) {
- var ctx, frame, data, current, y, x, pixel;
+function _computeCommonDivisors(m, n) {
+ if (m === n) {
+ return _computeDivisors(m);
+ }
- if (!scale) {
- scale = 1.0;
+ var max = m > n ? m : n;
+ var min = m > n ? n : m;
+ var divisors = new Array();
+ var largeDivisors = new Array();
+
+ for (var divisor = 1; divisor * divisor <= min; divisor++) {
+ if (max % divisor === 0 && min % divisor === 0) {
+ divisors.push(divisor);
+ var largeDivisor = min / divisor | 0;
+
+ if (divisor !== largeDivisor && max % largeDivisor === 0) {
+ largeDivisors.unshift();
+ }
}
- ctx = canvas.getContext('2d');
- canvas.width = this.size.x;
- canvas.height = this.size.y;
- frame = ctx.getImageData(0, 0, canvas.width, canvas.height);
- data = frame.data;
- current = 0;
- for (y = 0; y < this.size.y; y++) {
- for (x = 0; x < this.size.x; x++) {
- pixel = y * this.size.x + x;
- current = this.get(x, y) * scale;
- data[pixel * 4 + 0] = current;
- data[pixel * 4 + 1] = current;
- data[pixel * 4 + 2] = current;
- data[pixel * 4 + 3] = 255;
- }
- }
- frame.data = data;
- ctx.putImageData(frame, 0, 0);
-};
+ }
-/**
- * Retrieves a given pixel position from the {SubImage}
- * @param x {Number} The x-position
- * @param y {Number} The y-position
- * @returns {Number} The grayscale value at the pixel-position
- */
-SubImage.prototype.get = function (x, y) {
- return this.data[(this.from.y + y) * this.originalSize.x + this.from.x + x];
-};
+ return divisors.concat(largeDivisors);
+}
-/**
- * Updates the underlying data from a given {ImageWrapper}
- * @param image {ImageWrapper} The updated image
- */
-SubImage.prototype.updateData = function (image) {
- this.originalSize = image.size;
- this.data = image.data;
-};
+function calculatePatchSize(patchSize, _ref) {
+ var x = _ref.x,
+ y = _ref.y;
+ var wideSide = Math.max(x | 0, y | 0) | 0;
+ var nrOfPatchesList = [8, 10, 15, 20, 32, 60, 80];
+ var nrOfPatchesMap = {
+ 'x-small': 5,
+ small: 4,
+ medium: 3,
+ large: 2,
+ 'x-large': 1
+ };
+ var nrOfPatchesIndex = nrOfPatchesMap[patchSize] || nrOfPatchesMap.medium | 0;
+ var nrOfPatches = nrOfPatchesList[nrOfPatchesIndex] | 0;
+ var desiredPatchSize = wideSide / nrOfPatches | 0;
-/**
- * Updates the position of the shared area
- * @param from {x,y} The new location
- * @returns {SubImage} returns {this} for possible chaining
- */
-SubImage.prototype.updateFrom = function (from) {
- this.from = from;
- return this;
-};
+ function findPatchSizeForDivisors(divisors) {
+ var i = 0;
+ var found = divisors[divisors.length >> 1] | 0;
-/* harmony default export */ __webpack_exports__["a"] = SubImage;
+ while (i < divisors.length - 1 && divisors[i] < desiredPatchSize) {
+ i++;
+ }
-/***/ }),
-/* 54 */
-/***/ (function(module, exports) {
+ if (i > 0) {
+ if (Math.abs(divisors[i] - desiredPatchSize) > Math.abs(divisors[i - 1] - desiredPatchSize)) {
+ found = divisors[i - 1] | 0;
+ } else {
+ found = divisors[i] | 0;
+ }
+ }
-/*
- * typedefs.js
- * Normalizes browser-specific prefixes
- */
+ if (desiredPatchSize / found < nrOfPatchesList[nrOfPatchesIndex + 1] / nrOfPatchesList[nrOfPatchesIndex] && desiredPatchSize / found > nrOfPatchesList[nrOfPatchesIndex - 1] / nrOfPatchesList[nrOfPatchesIndex]) {
+ return {
+ x: found,
+ y: found
+ };
+ }
-if (typeof window !== 'undefined') {
- window.requestAnimFrame = function () {
- return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function ( /* function FrameRequestCallback */callback) {
- window.setTimeout(callback, 1000 / 60);
- };
- }();
-}
-Math.imul = Math.imul || function (a, b) {
- var ah = a >>> 16 & 0xffff,
- al = a & 0xffff,
- bh = b >>> 16 & 0xffff,
- bl = b & 0xffff;
- // the shift by 0 fixes the sign on the high part
- // the final |0 converts the unsigned value into a signed value
- return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
-};
+ return null;
+ }
-if (typeof Object.assign !== 'function') {
- Object.assign = function (target) {
- // .length of function is 2
- 'use strict';
+ var optimalPatchSize = findPatchSizeForDivisors(_computeCommonDivisors(x, y)) || findPatchSizeForDivisors(_computeDivisors(wideSide)) || findPatchSizeForDivisors(_computeDivisors(desiredPatchSize * nrOfPatches));
+ return optimalPatchSize;
+}
+function checkImageConstraints(inputStream, config) {
+ var width = inputStream.width;
+ var height = inputStream.height;
+ var shift = config.halfSample ? 1 : 0 | 0;
+ var inputStreamConfig = inputStream.config; // calculate width and height based on area
+
+ if (inputStreamConfig && inputStreamConfig.area) {
+ var area = computeImageArea(width, height, inputStreamConfig.area);
+ inputStream.topLeft = area.topLeft;
+ inputStream.setCanvasSize(width, height);
+ width = area.width;
+ height = area.height;
+ }
- if (target === null) {
- // TypeError if undefined or null
- throw new TypeError('Cannot convert undefined or null to object');
- }
+ var size = {
+ x: width >> shift,
+ y: height >> shift
+ };
+ var patchSize = calculatePatchSize(config.patchSize, size);
- var to = Object(target);
+ if (true) {
+ console.log('Patch-Size:', JSON.stringify(patchSize));
+ }
- for (var index = 1; index < arguments.length; index++) {
- var nextSource = arguments[index];
+ inputStream.width = (size.x / patchSize.x << shift) * patchSize.x | 0;
+ inputStream.height = (size.y / patchSize.y << shift) * patchSize.y | 0;
- if (nextSource !== null) {
- // Skip over if undefined or null
- for (var nextKey in nextSource) {
- // Avoid bugs when hasOwnProperty is shadowed
- if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
- to[nextKey] = nextSource[nextKey];
- }
- }
- }
- }
- return to;
- };
-}
+ if (inputStream.width % patchSize.x === 0 && inputStream.height % patchSize.y === 0) {
+ return true;
+ } // eslint-disable-next-line max-len
-/***/ }),
-/* 55 */
-/***/ (function(module, exports) {
-module.exports = {
- inputStream: {
- name: "Live",
- type: "LiveStream",
- constraints: {
- width: 640,
- height: 480,
- // aspectRatio: 640/480, // optional
- facingMode: "environment" },
- area: {
- top: "0%",
- right: "0%",
- left: "0%",
- bottom: "0%"
- },
- singleChannel: false // true: only the red color-channel is read
- },
- locate: true,
- numOfWorkers: 0,
- decoder: {
- readers: ['code_128_reader'],
- debug: {
- drawBoundingBox: false,
- showFrequency: false,
- drawScanline: false,
- showPattern: false
- }
- },
- locator: {
- halfSample: true,
- patchSize: "medium", // x-small, small, medium, large, x-large
- debug: {
- showCanvas: false,
- showPatches: false,
- showFoundPatches: false,
- showSkeleton: false,
- showLabels: false,
- showPatchLabels: false,
- showRemainingPatchLabels: false,
- boxFromPatches: {
- showTransformed: false,
- showTransformedBox: false,
- showBB: false
- }
- }
- }
+ throw new Error("Image dimensions do not comply with the current settings: width (".concat(width, ") and height (").concat(height, ") must be a multiple of ").concat(patchSize.x));
+}
+function _parseCssDimensionValues(value) {
+ var dimension = {
+ value: parseFloat(value),
+ unit: value.indexOf('%') === value.length - 1 ? '%' : value.indexOf('px') === value.length - 2 ? 'px' : '%'
+ };
+ return dimension;
+}
+var _dimensionsConverters = {
+ bottom: function bottom(dimension, _ref2) {
+ var height = _ref2.height;
+ return dimension.unit === '%' ? height - height * dimension.value / 100 | 0 : dimension.unit === 'px' ? height - dimension.value : height;
+ },
+ left: function left(dimension, _ref3) {
+ var width = _ref3.width;
+ return dimension.unit === '%' ? width * dimension.value / 100 | 0 : dimension.unit === 'px' ? dimension.value : 0;
+ },
+ right: function right(dimension, _ref4) {
+ var width = _ref4.width;
+ return dimension.unit === '%' ? width - width * dimension.value / 100 | 0 : dimension.unit === 'px' ? width - dimension.value : width;
+ },
+ top: function top(dimension, _ref5) {
+ var height = _ref5.height;
+ return dimension.unit === '%' ? height * dimension.value / 100 | 0 : dimension.unit === 'px' ? dimension.value : 0;
+ }
};
+function computeImageArea(inputWidth, inputHeight, area) {
+ var context = {
+ width: inputWidth,
+ height: inputHeight
+ };
+ var parsedArea = Object.keys(area).reduce(function (result, key) {
+ var value = area[key];
-/***/ }),
-/* 56 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ var parsed = _parseCssDimensionValues(value);
-"use strict";
-var config = void 0;
+ var calculated = _dimensionsConverters[key](parsed, context);
-if (true) {
- config = __webpack_require__(55);
-} else if (ENV.node) {
- config = require('./config.node.js');
-} else {
- config = require('./config.prod.js');
+ result[key] = calculated;
+ return result;
+ }, {});
+ return {
+ topLeft: {
+ x: parsedArea.left,
+ y: parsedArea.top
+ },
+ width: parsedArea.right - parsedArea.left,
+ height: parsedArea.bottom - parsedArea.top
+ };
}
-/* harmony default export */ __webpack_exports__["a"] = config;
-
/***/ }),
-/* 57 */
+
+/***/ "./src/input/input-stream.ts":
+/*!***********************************!*\
+ !*** ./src/input/input-stream.ts ***!
+ \***********************************/
+/*! exports provided: InputStream */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__bresenham__ = __webpack_require__(58);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_image_debug__ = __webpack_require__(9);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reader_code_128_reader__ = __webpack_require__(69);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reader_ean_reader__ = __webpack_require__(4);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reader_code_39_reader__ = __webpack_require__(31);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reader_code_39_vin_reader__ = __webpack_require__(70);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__reader_codabar_reader__ = __webpack_require__(68);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__reader_upc_reader__ = __webpack_require__(77);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__reader_ean_8_reader__ = __webpack_require__(74);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__reader_ean_2_reader__ = __webpack_require__(72);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__reader_ean_5_reader__ = __webpack_require__(73);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__reader_upc_e_reader__ = __webpack_require__(76);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__reader_i2of5_reader__ = __webpack_require__(75);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__reader_2of5_reader__ = __webpack_require__(67);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__reader_code_93_reader__ = __webpack_require__(71);
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputStream", function() { return InputStream; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+var InputStream =
+/*#__PURE__*/
+function () {
+ function InputStream() {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, InputStream);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_calculatedHeight", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_calculatedWidth", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvasHeight", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_canvasWidth", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_config", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_eventNames", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_eventHandlers", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_topLeft", void 0);
+ this._canvasWidth = 0;
+ this._canvasHeight = 0;
+ this._config = null;
+ this._eventNames = ['canrecord', 'ended'];
+ this._eventHandlers = new Map();
+ this._topLeft = {
+ x: 0,
+ y: 0
+ };
+ }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(InputStream, [{
+ key: "setCanvasSize",
+ value: function setCanvasSize(width, height) {
+ this._canvasWidth = width;
+ this._canvasHeight = height;
+ }
+ }, {
+ key: "addEventListener",
+ value: function addEventListener(event, listener, _options) {
+ if (this._eventNames.indexOf(event) !== -1) {
+ if (!this._eventHandlers.has(event)) {
+ this._eventHandlers.set(event, new Array());
+ }
-var READERS = {
- code_128_reader: __WEBPACK_IMPORTED_MODULE_2__reader_code_128_reader__["a" /* default */],
- ean_reader: __WEBPACK_IMPORTED_MODULE_3__reader_ean_reader__["a" /* default */],
- ean_5_reader: __WEBPACK_IMPORTED_MODULE_10__reader_ean_5_reader__["a" /* default */],
- ean_2_reader: __WEBPACK_IMPORTED_MODULE_9__reader_ean_2_reader__["a" /* default */],
- ean_8_reader: __WEBPACK_IMPORTED_MODULE_8__reader_ean_8_reader__["a" /* default */],
- code_39_reader: __WEBPACK_IMPORTED_MODULE_4__reader_code_39_reader__["a" /* default */],
- code_39_vin_reader: __WEBPACK_IMPORTED_MODULE_5__reader_code_39_vin_reader__["a" /* default */],
- codabar_reader: __WEBPACK_IMPORTED_MODULE_6__reader_codabar_reader__["a" /* default */],
- upc_reader: __WEBPACK_IMPORTED_MODULE_7__reader_upc_reader__["a" /* default */],
- upc_e_reader: __WEBPACK_IMPORTED_MODULE_11__reader_upc_e_reader__["a" /* default */],
- i2of5_reader: __WEBPACK_IMPORTED_MODULE_12__reader_i2of5_reader__["a" /* default */],
- '2of5_reader': __WEBPACK_IMPORTED_MODULE_13__reader_2of5_reader__["a" /* default */],
- code_93_reader: __WEBPACK_IMPORTED_MODULE_14__reader_code_93_reader__["a" /* default */]
-};
-/* harmony default export */ __webpack_exports__["a"] = {
- create: function create(config, inputImageWrapper) {
- var _canvas = {
- ctx: {
- frequency: null,
- pattern: null,
- overlay: null
- },
- dom: {
- frequency: null,
- pattern: null,
- overlay: null
- }
- },
- _barcodeReaders = [];
-
- initCanvas();
- initReaders();
- initConfig();
-
- function initCanvas() {
- if (true && typeof document !== 'undefined') {
- var $debug = document.querySelector("#debug.detection");
- _canvas.dom.frequency = document.querySelector("canvas.frequency");
- if (!_canvas.dom.frequency) {
- _canvas.dom.frequency = document.createElement("canvas");
- _canvas.dom.frequency.className = "frequency";
- if ($debug) {
- $debug.appendChild(_canvas.dom.frequency);
- }
- }
- _canvas.ctx.frequency = _canvas.dom.frequency.getContext("2d");
-
- _canvas.dom.pattern = document.querySelector("canvas.patternBuffer");
- if (!_canvas.dom.pattern) {
- _canvas.dom.pattern = document.createElement("canvas");
- _canvas.dom.pattern.className = "patternBuffer";
- if ($debug) {
- $debug.appendChild(_canvas.dom.pattern);
- }
- }
- _canvas.ctx.pattern = _canvas.dom.pattern.getContext("2d");
+ this._eventHandlers.get(event).push(listener);
+ }
+ }
+ }, {
+ key: "clearEventHandlers",
+ value: function clearEventHandlers() {
+ this._eventHandlers.clear();
+ }
+ }, {
+ key: "trigger",
+ value: function trigger(eventName, argArray) {
+ var _this = this;
- _canvas.dom.overlay = document.querySelector("canvas.drawingBuffer");
- if (_canvas.dom.overlay) {
- _canvas.ctx.overlay = _canvas.dom.overlay.getContext("2d");
- }
- }
- }
+ var handlers = this._eventHandlers.get(eventName);
- function initReaders() {
- config.readers.forEach(function (readerConfig) {
- var reader,
- configuration = {},
- supplements = [];
+ if (handlers) {
+ handlers.forEach(function (handler) {
+ return handler.apply(_this, argArray);
+ });
+ }
+ }
+ }, {
+ key: "height",
+ get: function get() {
+ return this._calculatedHeight;
+ },
+ set: function set(height) {
+ this._calculatedHeight = height;
+ }
+ }, {
+ key: "width",
+ get: function get() {
+ return this._calculatedWidth;
+ },
+ set: function set(width) {
+ this._calculatedWidth = width;
+ }
+ }, {
+ key: "topLeft",
+ get: function get() {
+ return _objectSpread({}, this._topLeft);
+ },
+ set: function set(topLeft) {
+ this._topLeft.x = topLeft.x;
+ this._topLeft.y = topLeft.y;
+ }
+ }, {
+ key: "canvasHeight",
+ get: function get() {
+ return this._canvasHeight;
+ }
+ }, {
+ key: "canvasWidth",
+ get: function get() {
+ return this._canvasWidth;
+ }
+ }]);
- if ((typeof readerConfig === 'undefined' ? 'undefined' : _typeof(readerConfig)) === 'object') {
- reader = readerConfig.format;
- configuration = readerConfig.config;
- } else if (typeof readerConfig === 'string') {
- reader = readerConfig;
- }
- if (true) {
- console.log("Before registering reader: ", reader);
- }
- if (configuration.supplements) {
- supplements = configuration.supplements.map(function (supplement) {
- return new READERS[supplement]();
- });
- }
- _barcodeReaders.push(new READERS[reader](configuration, supplements));
- });
- if (true) {
- console.log("Registered Readers: " + _barcodeReaders.map(function (reader) {
- return JSON.stringify({ format: reader.FORMAT, config: reader.config });
- }).join(', '));
- }
- }
+ return InputStream;
+}();
- function initConfig() {
- if (true && typeof document !== 'undefined') {
- var i,
- vis = [{
- node: _canvas.dom.frequency,
- prop: config.debug.showFrequency
- }, {
- node: _canvas.dom.pattern,
- prop: config.debug.showPattern
- }];
-
- for (i = 0; i < vis.length; i++) {
- if (vis[i].prop === true) {
- vis[i].node.style.display = "block";
- } else {
- vis[i].node.style.display = "none";
- }
- }
- }
- }
+/***/ }),
- /**
- * extend the line on both ends
- * @param {Array} line
- * @param {Number} angle
- */
- function getExtendedLine(line, angle, ext) {
- function extendLine(amount) {
- var extension = {
- y: amount * Math.sin(angle),
- x: amount * Math.cos(angle)
- };
+/***/ "./src/input/live-stream.ts":
+/*!**********************************!*\
+ !*** ./src/input/live-stream.ts ***!
+ \**********************************/
+/*! exports provided: LiveStream */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- line[0].y -= extension.y;
- line[0].x -= extension.x;
- line[1].y += extension.y;
- line[1].x += extension.x;
- }
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LiveStream", function() { return LiveStream; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _video_stream__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./video-stream */ "./src/input/video-stream.ts");
- // check if inside image
- extendLine(ext);
- while (ext > 1 && (!inputImageWrapper.inImageWithBorder(line[0], 0) || !inputImageWrapper.inImageWithBorder(line[1], 0))) {
- ext -= Math.ceil(ext / 2);
- extendLine(-ext);
- }
- return line;
- }
- function getLine(box) {
- return [{
- x: (box[1][0] - box[0][0]) / 2 + box[0][0],
- y: (box[1][1] - box[0][1]) / 2 + box[0][1]
- }, {
- x: (box[3][0] - box[2][0]) / 2 + box[2][0],
- y: (box[3][1] - box[2][1]) / 2 + box[2][1]
- }];
- }
- function tryDecode(line) {
- var result = null,
- i,
- barcodeLine = __WEBPACK_IMPORTED_MODULE_0__bresenham__["a" /* default */].getBarcodeLine(inputImageWrapper, line[0], line[1]);
- if (true && config.debug.showFrequency) {
- __WEBPACK_IMPORTED_MODULE_1__common_image_debug__["a" /* default */].drawPath(line, { x: 'x', y: 'y' }, _canvas.ctx.overlay, { color: 'red', lineWidth: 3 });
- __WEBPACK_IMPORTED_MODULE_0__bresenham__["a" /* default */].debug.printFrequency(barcodeLine.line, _canvas.dom.frequency);
- }
- __WEBPACK_IMPORTED_MODULE_0__bresenham__["a" /* default */].toBinaryLine(barcodeLine);
- if (true && config.debug.showPattern) {
- __WEBPACK_IMPORTED_MODULE_0__bresenham__["a" /* default */].debug.printPattern(barcodeLine.line, _canvas.dom.pattern);
- }
+var LiveStream =
+/*#__PURE__*/
+function (_VideoStream) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(LiveStream, _VideoStream);
- for (i = 0; i < _barcodeReaders.length && result === null; i++) {
- result = _barcodeReaders[i].decodePattern(barcodeLine.line);
- }
- if (result === null) {
- return null;
- }
- return {
- codeResult: result,
- barcodeLine: barcodeLine
- };
- }
+ function LiveStream(video) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, LiveStream);
- /**
- * This method slices the given area apart and tries to detect a barcode-pattern
- * for each slice. It returns the decoded barcode, or null if nothing was found
- * @param {Array} box
- * @param {Array} line
- * @param {Number} lineAngle
- */
- function tryDecodeBruteForce(box, line, lineAngle) {
- var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow(box[1][1] - box[0][1], 2)),
- i,
- slices = 16,
- result = null,
- dir,
- extension,
- xdir = Math.sin(lineAngle),
- ydir = Math.cos(lineAngle);
-
- for (i = 1; i < slices && result === null; i++) {
- // move line perpendicular to angle
- dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1);
- extension = {
- y: dir * xdir,
- x: dir * ydir
- };
- line[0].y += extension.x;
- line[0].x -= extension.y;
- line[1].y += extension.x;
- line[1].x -= extension.y;
+ video.setAttribute('autoplay', '');
+ return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(LiveStream).call(this, video));
+ }
- result = tryDecode(line);
- }
- return result;
- }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(LiveStream, [{
+ key: "ended",
+ get: function get() {
+ return false;
+ }
+ }]);
- function getLineLength(line) {
- return Math.sqrt(Math.pow(Math.abs(line[1].y - line[0].y), 2) + Math.pow(Math.abs(line[1].x - line[0].x), 2));
- }
+ return LiveStream;
+}(_video_stream__WEBPACK_IMPORTED_MODULE_5__["VideoStream"]);
- /**
- * With the help of the configured readers (Code128 or EAN) this function tries to detect a
- * valid barcode pattern within the given area.
- * @param {Object} box The area to search in
- * @returns {Object} the result {codeResult, line, angle, pattern, threshold}
- */
- function _decodeFromBoundingBox(box) {
- var line,
- lineAngle,
- ctx = _canvas.ctx.overlay,
- result,
- lineLength;
+/***/ }),
- if (true) {
- if (config.debug.drawBoundingBox && ctx) {
- __WEBPACK_IMPORTED_MODULE_1__common_image_debug__["a" /* default */].drawPath(box, { x: 0, y: 1 }, ctx, { color: "blue", lineWidth: 2 });
- }
- }
+/***/ "./src/input/video-stream.ts":
+/*!***********************************!*\
+ !*** ./src/input/video-stream.ts ***!
+ \***********************************/
+/*! exports provided: VideoStream, LiveStream */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- line = getLine(box);
- lineLength = getLineLength(line);
- lineAngle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x);
- line = getExtendedLine(line, lineAngle, Math.floor(lineLength * 0.1));
- if (line === null) {
- return null;
- }
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VideoStream", function() { return VideoStream; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LiveStream", function() { return LiveStream; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "../../node_modules/@babel/runtime/helpers/get.js");
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _input_stream__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input-stream */ "./src/input/input-stream.ts");
- result = tryDecode(line);
- if (result === null) {
- result = tryDecodeBruteForce(box, line, lineAngle);
- }
- if (result === null) {
- return null;
- }
- if (true && result && config.debug.drawScanline && ctx) {
- __WEBPACK_IMPORTED_MODULE_1__common_image_debug__["a" /* default */].drawPath(line, { x: 'x', y: 'y' }, ctx, { color: 'red', lineWidth: 3 });
- }
- return {
- codeResult: result.codeResult,
- line: line,
- angle: lineAngle,
- pattern: result.barcodeLine.line,
- threshold: result.barcodeLine.threshold
- };
- }
- return {
- decodeFromBoundingBox: function decodeFromBoundingBox(box) {
- return _decodeFromBoundingBox(box);
- },
- decodeFromBoundingBoxes: function decodeFromBoundingBoxes(boxes) {
- var i,
- result,
- barcodes = [],
- multiple = config.multiple;
-
- for (i = 0; i < boxes.length; i++) {
- var box = boxes[i];
- result = _decodeFromBoundingBox(box) || {};
- result.box = box;
-
- if (multiple) {
- barcodes.push(result);
- } else if (result.codeResult) {
- return result;
- }
- }
- if (multiple) {
- return {
- barcodes: barcodes
- };
- }
- },
- setReaders: function setReaders(readers) {
- config.readers = readers;
- _barcodeReaders.length = 0;
- initReaders();
- }
- };
- }
-};
-/***/ }),
-/* 58 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__ = __webpack_require__(20);
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-var Bresenham = {};
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-var Slope = {
- DIR: {
- UP: 1,
- DOWN: -1
- }
-};
-/**
- * Scans a line of the given image from point p1 to p2 and returns a result object containing
- * gray-scale values (0-255) of the underlying pixels in addition to the min
- * and max values.
- * @param {Object} imageWrapper
- * @param {Object} p1 The start point {x,y}
- * @param {Object} p2 The end point {x,y}
- * @returns {line, min, max}
- */
-Bresenham.getBarcodeLine = function (imageWrapper, p1, p2) {
- var x0 = p1.x | 0,
- y0 = p1.y | 0,
- x1 = p2.x | 0,
- y1 = p2.y | 0,
- steep = Math.abs(y1 - y0) > Math.abs(x1 - x0),
- deltax,
- deltay,
- error,
- ystep,
- y,
- tmp,
- x,
- line = [],
- imageData = imageWrapper.data,
- width = imageWrapper.size.x,
- sum = 0,
- val,
- min = 255,
- max = 0;
- function read(a, b) {
- val = imageData[b * width + a];
- sum += val;
- min = val < min ? val : min;
- max = val > max ? val : max;
- line.push(val);
- }
+var VideoStream =
+/*#__PURE__*/
+function (_InputStream) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(VideoStream, _InputStream);
- if (steep) {
- tmp = x0;
- x0 = y0;
- y0 = tmp;
+ function VideoStream(video) {
+ var _this;
- tmp = x1;
- x1 = y1;
- y1 = tmp;
- }
- if (x0 > x1) {
- tmp = x0;
- x0 = x1;
- x1 = tmp;
-
- tmp = y0;
- y0 = y1;
- y1 = tmp;
- }
- deltax = x1 - x0;
- deltay = Math.abs(y1 - y0);
- error = deltax / 2 | 0;
- y = y0;
- ystep = y0 < y1 ? 1 : -1;
- for (x = x0; x < x1; x++) {
- if (steep) {
- read(y, x);
- } else {
- read(x, y);
- }
- error = error - deltay;
- if (error < 0) {
- y = y + ystep;
- error = error + deltax;
- }
- }
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, VideoStream);
- return {
- line: line,
- min: min,
- max: max
- };
-};
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(VideoStream).call(this));
-/**
- * Converts the result from getBarcodeLine into a binary representation
- * also considering the frequency and slope of the signal for more robust results
- * @param {Object} result {line, min, max}
- */
-Bresenham.toBinaryLine = function (result) {
- var min = result.min,
- max = result.max,
- line = result.line,
- slope,
- slope2,
- center = min + (max - min) / 2,
- extrema = [],
- currentDir,
- dir,
- threshold = (max - min) / 12,
- rThreshold = -threshold,
- i,
- j;
-
- // 1. find extrema
- currentDir = line[0] > center ? Slope.DIR.UP : Slope.DIR.DOWN;
- extrema.push({
- pos: 0,
- val: line[0]
- });
- for (i = 0; i < line.length - 2; i++) {
- slope = line[i + 1] - line[i];
- slope2 = line[i + 2] - line[i + 1];
- if (slope + slope2 < rThreshold && line[i + 1] < center * 1.5) {
- dir = Slope.DIR.DOWN;
- } else if (slope + slope2 > threshold && line[i + 1] > center * 0.5) {
- dir = Slope.DIR.UP;
- } else {
- dir = currentDir;
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default()(_this), "_video", void 0);
- if (currentDir !== dir) {
- extrema.push({
- pos: i,
- val: line[i]
- });
- currentDir = dir;
- }
- }
- extrema.push({
- pos: line.length,
- val: line[line.length - 1]
- });
+ _this._video = video;
+ return _this;
+ }
- for (j = extrema[0].pos; j < extrema[1].pos; j++) {
- line[j] = line[j] > center ? 0 : 1;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(VideoStream, [{
+ key: "setAttribute",
+ value: function setAttribute(name, value) {
+ this._video.setAttribute(name, value);
+ }
+ }, {
+ key: "pause",
+ value: function pause() {
+ this._video.pause();
}
+ }, {
+ key: "play",
+ value: function play() {
+ this._video.play();
+ }
+ }, {
+ key: "addEventListener",
+ value: function addEventListener(event, listener, options) {
+ _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(VideoStream.prototype), "addEventListener", this).call(this, event, listener, options);
- // iterate over extrema and convert to binary based on avg between minmax
- for (i = 1; i < extrema.length - 1; i++) {
- if (extrema[i + 1].val > extrema[i].val) {
- threshold = extrema[i].val + (extrema[i + 1].val - extrema[i].val) / 3 * 2 | 0;
- } else {
- threshold = extrema[i + 1].val + (extrema[i].val - extrema[i + 1].val) / 3 | 0;
- }
+ if (this._eventNames.indexOf(event) === -1) {
+ this._video.addEventListener(event, listener, options);
+ }
+ }
+ }, {
+ key: "clearEventHandlers",
+ value: function clearEventHandlers() {
+ // TODO: come up with a way to remove video event handlers
+ // this._eventNames.forEach(eventName => {
+ // const handlers = this._eventHandlers.get(eventName);
+ // if (handlers && handlers.length > 0) {
+ // handlers.forEach(handler => this._video.removeEventListener(eventName, handler));
+ // }
+ // });
+ _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(VideoStream.prototype), "clearEventHandlers", this).call(this);
+ }
+ }, {
+ key: "trigger",
+ value: function trigger(eventName, argArray) {
+ if (eventName === 'canrecord') {
+ this._initSize();
+ }
- for (j = extrema[i].pos; j < extrema[i + 1].pos; j++) {
- line[j] = line[j] > threshold ? 0 : 1;
- }
+ _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(VideoStream.prototype), "trigger", this).call(this, eventName, argArray);
+ }
+ }, {
+ key: "getFrame",
+ value: function getFrame() {
+ return this._video;
+ }
+ }, {
+ key: "_initSize",
+ value: function _initSize() {
+ var width = this._video.videoWidth;
+ var height = this._video.videoHeight;
+ this._canvasWidth = this._calculatedWidth = this._config.size ? width > height ? this._config.size : width * this._config.size / height | 0 : width;
+ this._canvasHeight = this._calculatedHeight = this._config.size ? width > height ? height * this._config.size / width | 0 : this._config.size : height;
+ }
+ }, {
+ key: "realHeight",
+ get: function get() {
+ return this._video.videoHeight;
+ }
+ }, {
+ key: "realWidth",
+ get: function get() {
+ return this._video.videoWidth;
+ }
+ }, {
+ key: "config",
+ get: function get() {
+ return this._config;
+ },
+ set: function set(config) {
+ this._config = _objectSpread({}, config);
+ this._video.src = config.src || '';
+ }
+ }, {
+ key: "ended",
+ get: function get() {
+ return this._video.ended;
+ }
+ }, {
+ key: "currentTime",
+ set: function set(time) {
+ if (this._config.type !== 'LiveStream') {
+ this._video.currentTime = time;
+ }
}
+ }]);
- return {
- line: line,
- threshold: threshold
- };
-};
+ return VideoStream;
+}(_input_stream__WEBPACK_IMPORTED_MODULE_8__["InputStream"]);
+var LiveStream =
+/*#__PURE__*/
+function (_VideoStream) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(LiveStream, _VideoStream);
-/**
- * Used for development only
- */
-Bresenham.debug = {
- printFrequency: function printFrequency(line, canvas) {
- var i,
- ctx = canvas.getContext("2d");
- canvas.width = line.length;
- canvas.height = 256;
-
- ctx.beginPath();
- ctx.strokeStyle = "blue";
- for (i = 0; i < line.length; i++) {
- ctx.moveTo(i, 255);
- ctx.lineTo(i, 255 - line[i]);
- }
- ctx.stroke();
- ctx.closePath();
- },
+ function LiveStream(video) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, LiveStream);
- printPattern: function printPattern(line, canvas) {
- var ctx = canvas.getContext("2d"),
- i;
+ video.setAttribute('autoplay', '');
+ return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(LiveStream).call(this, video));
+ }
- canvas.width = line.length;
- ctx.fillColor = "black";
- for (i = 0; i < line.length; i++) {
- if (line[i] === 1) {
- ctx.fillRect(i, 0, 1, 100);
- }
- }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(LiveStream, [{
+ key: "ended",
+ get: function get() {
+ return false;
}
-};
+ }]);
-/* harmony default export */ __webpack_exports__["a"] = Bresenham;
+ return LiveStream;
+}(VideoStream);
/***/ }),
-/* 59 */
+
+/***/ "./src/locator/barcode-locator-utils.ts":
+/*!**********************************************!*\
+ !*** ./src/locator/barcode-locator-utils.ts ***!
+ \**********************************************/
+/*! exports provided: invert, transformWithMatrix, otsuThreshold, halfSample */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_pick__ = __webpack_require__(162);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_pick___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_pick__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_mediaDevices__ = __webpack_require__(52);
-/* unused harmony export pickConstraints */
-
-
-
-
-var facingMatching = {
- "user": /front/i,
- "environment": /back/i
-};
-
-var streamRef;
-
-function waitForVideo(video) {
- return new Promise(function (resolve, reject) {
- var attempts = 10;
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "invert", function() { return invert; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformWithMatrix", function() { return transformWithMatrix; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "otsuThreshold", function() { return otsuThreshold; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "halfSample", function() { return halfSample; });
+/**
+ * Invert matrix
+ * @param matrix the matrix to invert
+ * @returns the inverted matrix
+ */
+function invert(matrix) {
+ var a0 = matrix[0];
+ var a1 = matrix[1];
+ var a2 = matrix[2];
+ var a3 = matrix[3];
+ var determinant = a0 * a3 - a2 * a1;
+
+ if (!determinant) {
+ return null;
+ }
- function checkVideo() {
- if (attempts > 0) {
- if (video.videoWidth > 10 && video.videoHeight > 10) {
- if (true) {
- console.log(video.videoWidth + "px x " + video.videoHeight + "px");
- }
- resolve();
- } else {
- window.setTimeout(checkVideo, 500);
- }
- } else {
- reject('Unable to play video stream. Is webcam working?');
- }
- attempts--;
- }
- checkVideo();
- });
+ return new Float32Array([a3 / determinant, -a1 / determinant, -a2 / determinant, a0 / determinant]);
}
-
/**
- * Tries to attach the camera-stream to a given video-element
- * and calls the callback function when the content is ready
- * @param {Object} constraints
- * @param {Object} video
+ * Transforms the vector with a matrix
+ * @param { x, y } vector to transform
+ * @param matrix matrix to transform with
+ * @returns the transformed vector
*/
-function initCamera(video, constraints) {
- return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1_mediaDevices__["a" /* getUserMedia */])(constraints).then(function (stream) {
- return new Promise(function (resolve) {
- streamRef = stream;
- video.setAttribute("autoplay", true);
- video.setAttribute('muted', true);
- video.setAttribute('playsinline', true);
- video.srcObject = stream;
- video.addEventListener('loadedmetadata', function () {
- video.play();
- resolve();
- });
- });
- }).then(waitForVideo.bind(null, video));
-}
-function deprecatedConstraints(videoConstraints) {
- var normalized = __WEBPACK_IMPORTED_MODULE_0_lodash_pick___default()(videoConstraints, ["width", "height", "facingMode", "aspectRatio", "deviceId"]);
-
- if (typeof videoConstraints.minAspectRatio !== 'undefined' && videoConstraints.minAspectRatio > 0) {
- normalized.aspectRatio = videoConstraints.minAspectRatio;
- console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead");
- }
- if (typeof videoConstraints.facing !== 'undefined') {
- normalized.facingMode = videoConstraints.facing;
- console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'");
- }
- return normalized;
+function transformWithMatrix(_ref, matrix) {
+ var x = _ref.x,
+ y = _ref.y;
+ return {
+ x: matrix[0] * x + matrix[2] * y,
+ y: matrix[1] * x + matrix[3] * y
+ };
}
-function pickConstraints(videoConstraints) {
- var normalizedConstraints = {
- audio: false,
- video: deprecatedConstraints(videoConstraints)
- };
+function _computeHistogram(imageWrapper, bitsPerPixel) {
+ if (!bitsPerPixel) {
+ bitsPerPixel = 8;
+ }
- if (normalizedConstraints.video.deviceId && normalizedConstraints.video.facingMode) {
- delete normalizedConstraints.video.facingMode;
- }
- return Promise.resolve(normalizedConstraints);
-}
+ var imageData = imageWrapper.data;
+ var bitShift = 8 - bitsPerPixel;
+ var bucketCount = 1 << bitsPerPixel;
+ var histogram = new Int32Array(bucketCount);
-function enumerateVideoDevices() {
- return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1_mediaDevices__["b" /* enumerateDevices */])().then(function (devices) {
- return devices.filter(function (device) {
- return device.kind === 'videoinput';
- });
- });
-}
+ for (var i = imageData.length; i--;) {
+ histogram[imageData[i] >> bitShift]++;
+ }
-function getActiveTrack() {
- if (streamRef) {
- var tracks = streamRef.getVideoTracks();
- if (tracks && tracks.length) {
- return tracks[0];
- }
- }
+ return histogram;
}
-/* harmony default export */ __webpack_exports__["a"] = {
- request: function request(video, videoConstraints) {
- return pickConstraints(videoConstraints).then(initCamera.bind(null, video));
- },
- release: function release() {
- var tracks = streamRef && streamRef.getVideoTracks();
- if (tracks && tracks.length) {
- tracks[0].stop();
- }
- streamRef = null;
- },
- enumerateVideoDevices: enumerateVideoDevices,
- getActiveStreamLabel: function getActiveStreamLabel() {
- var track = getActiveTrack();
- return track ? track.label : '';
- },
- getActiveTrack: getActiveTrack
-};
+function _determineOtsuThreshold(imageWrapper, bitsPerPixel) {
+ if (!bitsPerPixel) {
+ bitsPerPixel = 8;
+ }
-/***/ }),
-/* 60 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ var bitShift = 8 - bitsPerPixel;
-"use strict";
-/* unused harmony export AvailableTags */
-/* harmony export (immutable) */ __webpack_exports__["a"] = findTagsInObjectURL;
-/* unused harmony export base64ToArrayBuffer */
-/* unused harmony export findTagsInBuffer */
-// Scraped from https://github.com/exif-js/exif-js
+ var hist = _computeHistogram(imageWrapper, bitsPerPixel);
-var ExifTags = { 0x0112: "orientation" };
-var AvailableTags = Object.keys(ExifTags).map(function (key) {
- return ExifTags[key];
-});
+ var vet = [0];
+ var max = (1 << bitsPerPixel) - 1;
-function findTagsInObjectURL(src) {
- var tags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags;
+ function px(init, end) {
+ var sum = 0;
- if (/^blob\:/i.test(src)) {
- return objectURLToBlob(src).then(readToBuffer).then(function (buffer) {
- return findTagsInBuffer(buffer, tags);
- });
+ for (var i = init; i <= end; i++) {
+ sum += hist[i];
}
- return Promise.resolve(null);
-}
-function base64ToArrayBuffer(dataUrl) {
- var base64 = dataUrl.replace(/^data\:([^\;]+)\;base64,/gmi, ''),
- binary = atob(base64),
- len = binary.length,
- buffer = new ArrayBuffer(len),
- view = new Uint8Array(buffer);
+ return sum;
+ }
+
+ function mx(init, end) {
+ var sum = 0;
- for (var i = 0; i < len; i++) {
- view[i] = binary.charCodeAt(i);
+ for (var i = init; i <= end; i++) {
+ sum += i * hist[i];
}
- return buffer;
-}
-
-function readToBuffer(blob) {
- return new Promise(function (resolve) {
- var fileReader = new FileReader();
- fileReader.onload = function (e) {
- return resolve(e.target.result);
- };
- fileReader.readAsArrayBuffer(blob);
- });
-}
-function objectURLToBlob(url) {
- return new Promise(function (resolve, reject) {
- var http = new XMLHttpRequest();
- http.open("GET", url, true);
- http.responseType = "blob";
- http.onreadystatechange = function () {
- if (http.readyState === XMLHttpRequest.DONE && (http.status === 200 || http.status === 0)) {
- resolve(this.response);
- }
- };
- http.onerror = reject;
- http.send();
- });
-}
+ return sum;
+ }
-function findTagsInBuffer(file) {
- var selectedTags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags;
+ for (var k = 1; k < max; k++) {
+ var p1 = px(0, k);
+ var p2 = px(k + 1, max);
+ var p12 = p1 * p2 || 1;
+ var m1 = mx(0, k) * p2;
+ var m2 = mx(k + 1, max) * p1;
+ var m12 = m1 - m2;
+ vet[k] = m12 * m12 / p12;
+ } // index of max element
- var dataView = new DataView(file),
- length = file.byteLength,
- exifTags = selectedTags.reduce(function (result, selectedTag) {
- var exifTag = Object.keys(ExifTags).filter(function (tag) {
- return ExifTags[tag] === selectedTag;
- })[0];
- if (exifTag) {
- result[exifTag] = selectedTag;
- }
- return result;
- }, {});
- var offset = 2,
- marker = void 0;
- if (dataView.getUint8(0) !== 0xFF || dataView.getUint8(1) !== 0xD8) {
- return false;
- }
+ var threshold = vet.reduce(function (maxIndex, item, index, array) {
+ return item > array[maxIndex] ? index : maxIndex;
+ }, 0);
+ return threshold << bitShift;
+}
- while (offset < length) {
- if (dataView.getUint8(offset) !== 0xFF) {
- return false;
- }
+function otsuThreshold(imageWrapper, targetWrapper) {
+ var threshold = _determineOtsuThreshold(imageWrapper);
- marker = dataView.getUint8(offset + 1);
- if (marker === 0xE1) {
- return readEXIFData(dataView, offset + 4, exifTags);
- } else {
- offset += 2 + dataView.getUint16(offset + 2);
- }
- }
+ var targetData = targetWrapper.data;
+ imageWrapper.data.forEach(function (value, index) {
+ targetData[index] = value < threshold ? 1 : 0;
+ });
+ return threshold;
}
+/**
+ * @param imageWrapper input image to be sampled
+ * @param outImageWrapper {ImageWrapper} to be stored in
+ */
-function readEXIFData(file, start, exifTags) {
- if (getStringFromBuffer(file, start, 4) !== "Exif") {
- return false;
+function halfSample(imageWrapper, outImageWrapper) {
+ var image = imageWrapper.data;
+ var width = imageWrapper.size.x;
+ var outImage = outImageWrapper.data;
+ var endIndex = image.length;
+ var outWidth = width >> 1;
+ var topRowIndex = 0;
+ var bottomRowIndex = width;
+ var outImgIndex = 0;
+
+ while (bottomRowIndex < endIndex) {
+ for (var i = 0; i < outWidth; i++) {
+ outImage[outImgIndex] = image[topRowIndex] + image[topRowIndex + 1] + image[bottomRowIndex] + image[bottomRowIndex + 1] >> 2;
+ outImgIndex++;
+ topRowIndex += 2;
+ bottomRowIndex += 2;
}
- var tiffOffset = start + 6;
- var bigEnd = void 0,
- tags = void 0;
+ topRowIndex += width;
+ bottomRowIndex += width;
+ }
+}
- if (file.getUint16(tiffOffset) === 0x4949) {
- bigEnd = false;
- } else if (file.getUint16(tiffOffset) === 0x4D4D) {
- bigEnd = true;
- } else {
- return false;
- }
+/***/ }),
- if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) {
- return false;
- }
+/***/ "./src/locator/barcode-locator.ts":
+/*!****************************************!*\
+ !*** ./src/locator/barcode-locator.ts ***!
+ \****************************************/
+/*! exports provided: BarcodeLocator */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
- if (firstIFDOffset < 0x00000008) {
- return false;
- }
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BarcodeLocator", function() { return BarcodeLocator; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _common_cluster__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/cluster */ "./src/common/cluster.ts");
+/* harmony import */ var _common_hsv2rgb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/hsv2rgb */ "./src/common/hsv2rgb.ts");
+/* harmony import */ var _common_image_debug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common/image-debug */ "./src/common/image-debug.ts");
+/* harmony import */ var _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../common/image-wrapper */ "./src/common/image-wrapper.ts");
+/* harmony import */ var _input_input_stream_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../input/input-stream-utils */ "./src/input/input-stream-utils.ts");
+/* harmony import */ var _barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./barcode-locator-utils */ "./src/locator/barcode-locator-utils.ts");
+/* harmony import */ var _rasterizer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./rasterizer */ "./src/locator/rasterizer.ts");
+/* harmony import */ var _skeletonizer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./skeletonizer */ "./src/locator/skeletonizer.js");
+/* harmony import */ var _tracer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./tracer */ "./src/locator/tracer.ts");
- tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, exifTags, bigEnd);
- return tags;
-}
-function readTags(file, tiffStart, dirStart, strings, bigEnd) {
- var entries = file.getUint16(dirStart, !bigEnd),
- tags = {};
- for (var i = 0; i < entries; i++) {
- var entryOffset = dirStart + i * 12 + 2,
- tag = strings[file.getUint16(entryOffset, !bigEnd)];
- if (tag) {
- tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
- }
- }
- return tags;
-}
-function readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) {
- var type = file.getUint16(entryOffset + 2, !bigEnd),
- numValues = file.getUint32(entryOffset + 4, !bigEnd);
- switch (type) {
- case 3:
- if (numValues === 1) {
- return file.getUint16(entryOffset + 8, !bigEnd);
- }
- }
-}
-function getStringFromBuffer(buffer, start, length) {
- var outstr = "";
- for (var n = start; n < start + length; n++) {
- outstr += String.fromCharCode(buffer.getUint8(n));
- }
- return outstr;
-}
-/***/ }),
-/* 61 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__common_cv_utils__ = __webpack_require__(19);
-var TO_RADIANS = Math.PI / 180;
-function adjustCanvasSize(canvas, targetSize) {
- if (canvas.width !== targetSize.x) {
- if (true) {
- console.log("WARNING: canvas-size needs to be adjusted");
- }
- canvas.width = targetSize.x;
- }
- if (canvas.height !== targetSize.y) {
- if (true) {
- console.log("WARNING: canvas-size needs to be adjusted");
- }
- canvas.height = targetSize.y;
- }
-}
-var FrameGrabber = {};
-
-FrameGrabber.create = function (inputStream, canvas) {
- var _that = {},
- _streamConfig = inputStream.getConfig(),
- _video_size = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__common_cv_utils__["b" /* imageRef */])(inputStream.getRealWidth(), inputStream.getRealHeight()),
- _canvasSize = inputStream.getCanvasSize(),
- _size = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__common_cv_utils__["b" /* imageRef */])(inputStream.getWidth(), inputStream.getHeight()),
- topRight = inputStream.getTopRight(),
- _sx = topRight.x,
- _sy = topRight.y,
- _canvas,
- _ctx = null,
- _data = null;
-
- _canvas = canvas ? canvas : document.createElement("canvas");
- _canvas.width = _canvasSize.x;
- _canvas.height = _canvasSize.y;
- _ctx = _canvas.getContext("2d");
- _data = new Uint8Array(_size.x * _size.y);
- if (true) {
- console.log("FrameGrabber", JSON.stringify({
- size: _size,
- topRight: topRight,
- videoSize: _video_size,
- canvasSize: _canvasSize
- }));
- }
+var MomentSimilarityThreshold = 0.9;
+var BarcodeLocator =
+/*#__PURE__*/
+function () {
+ function BarcodeLocator(inputImageWrapper, config) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BarcodeLocator);
- /**
- * Uses the given array as frame-buffer
- */
- _that.attachData = function (data) {
- _data = data;
- };
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_config", void 0);
- /**
- * Returns the used frame-buffer
- */
- _that.getData = function () {
- return _data;
- };
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_inputImageWrapper", void 0);
- /**
- * Fetches a frame from the input-stream and puts into the frame-buffer.
- * The image-data is converted to gray-scale and then half-sampled if configured.
- */
- _that.grab = function () {
- var doHalfSample = _streamConfig.halfSample,
- frame = inputStream.getFrame(),
- drawable = frame,
- drawAngle = 0,
- ctxData;
- if (drawable) {
- adjustCanvasSize(_canvas, _canvasSize);
- if (_streamConfig.type === 'ImageStream') {
- drawable = frame.img;
- if (frame.tags && frame.tags.orientation) {
- switch (frame.tags.orientation) {
- case 6:
- drawAngle = 90 * TO_RADIANS;
- break;
- case 8:
- drawAngle = -90 * TO_RADIANS;
- break;
- }
- }
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_currentImageWrapper", void 0);
- if (drawAngle !== 0) {
- _ctx.translate(_canvasSize.x / 2, _canvasSize.y / 2);
- _ctx.rotate(drawAngle);
- _ctx.drawImage(drawable, -_canvasSize.y / 2, -_canvasSize.x / 2, _canvasSize.y, _canvasSize.x);
- _ctx.rotate(-drawAngle);
- _ctx.translate(-_canvasSize.x / 2, -_canvasSize.y / 2);
- } else {
- _ctx.drawImage(drawable, 0, 0, _canvasSize.x, _canvasSize.y);
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_skelImageWrapper", void 0);
- ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data;
- if (doHalfSample) {
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__common_cv_utils__["c" /* grayAndHalfSampleFromCanvasData */])(ctxData, _size, _data);
- } else {
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__common_cv_utils__["d" /* computeGray */])(ctxData, _data, _streamConfig);
- }
- return true;
- } else {
- return false;
- }
- };
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_subImageWrapper", void 0);
- _that.getSize = function () {
- return _size;
- };
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_labelImageWrapper", void 0);
- return _that;
-};
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_binaryImageWrapper", void 0);
-/* harmony default export */ __webpack_exports__["a"] = FrameGrabber;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_patchGrid", void 0);
-/***/ }),
-/* 62 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_patchLabelGrid", void 0);
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__exif_helper__ = __webpack_require__(60);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_imageToPatchGrid", void 0);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_patchSize", void 0);
-var ImageLoader = {};
-ImageLoader.load = function (directory, callback, offset, size, sequence) {
- var htmlImagesSrcArray = new Array(size),
- htmlImagesArray = new Array(htmlImagesSrcArray.length),
- i,
- img,
- num;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_binaryContext", void 0);
- if (sequence === false) {
- htmlImagesSrcArray[0] = directory;
- } else {
- for (i = 0; i < htmlImagesSrcArray.length; i++) {
- num = offset + i;
- htmlImagesSrcArray[i] = directory + "image-" + ("00" + num).slice(-3) + ".jpg";
- }
- }
- htmlImagesArray.notLoaded = [];
- htmlImagesArray.addImage = function (image) {
- htmlImagesArray.notLoaded.push(image);
- };
- htmlImagesArray.loaded = function (loadedImg) {
- var notloadedImgs = htmlImagesArray.notLoaded;
- for (var x = 0; x < notloadedImgs.length; x++) {
- if (notloadedImgs[x] === loadedImg) {
- notloadedImgs.splice(x, 1);
- for (var y = 0; y < htmlImagesSrcArray.length; y++) {
- var imgName = htmlImagesSrcArray[y].substr(htmlImagesSrcArray[y].lastIndexOf("/"));
- if (loadedImg.src.lastIndexOf(imgName) !== -1) {
- htmlImagesArray[y] = { img: loadedImg };
- break;
- }
- }
- break;
- }
- }
- if (notloadedImgs.length === 0) {
- if (true) {
- console.log("Images loaded");
- }
- if (sequence === false) {
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__exif_helper__["a" /* findTagsInObjectURL */])(directory, ['orientation']).then(function (tags) {
- htmlImagesArray[0].tags = tags;
- callback(htmlImagesArray);
- }).catch(function (e) {
- console.log(e);
- callback(htmlImagesArray);
- });
- } else {
- callback(htmlImagesArray);
- }
- }
- };
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_numPatches", void 0);
- for (i = 0; i < htmlImagesSrcArray.length; i++) {
- img = new Image();
- htmlImagesArray.addImage(img);
- addOnloadHandler(img, htmlImagesArray);
- img.src = htmlImagesSrcArray[i];
- }
-};
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_skeletonizer", void 0);
-function addOnloadHandler(img, htmlImagesArray) {
- img.onload = function () {
- htmlImagesArray.loaded(this);
+ this._config = config;
+ this._inputImageWrapper = inputImageWrapper;
+ this._numPatches = {
+ x: 0,
+ y: 0
};
-}
-/* harmony default export */ __webpack_exports__["a"] = ImageLoader;
+ this._initBuffers();
-/***/ }),
-/* 63 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ this._initCanvas();
+ }
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__image_loader__ = __webpack_require__(62);
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BarcodeLocator, [{
+ key: "locate",
+ value: function locate() {
+ if (this._config.halfSample) {
+ Object(_barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__["halfSample"])(this._inputImageWrapper, this._currentImageWrapper);
+ }
+ this._binarizeImage();
-var InputStream = {};
-InputStream.createVideoStream = function (video) {
- var that = {},
- _config = null,
- _eventNames = ['canrecord', 'ended'],
- _eventHandlers = {},
- _calculatedWidth,
- _calculatedHeight,
- _topRight = { x: 0, y: 0 },
- _canvasSize = { x: 0, y: 0 };
+ var patchesFound = this._findPatches(); // return unless 5% or more patches are found
- function initSize() {
- var width = video.videoWidth,
- height = video.videoHeight;
- _calculatedWidth = _config.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width;
- _calculatedHeight = _config.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height;
+ if (patchesFound.length < this._numPatches.x * this._numPatches.y * 0.05) {
+ return null;
+ } // rasterize area by comparing angular similarity;
- _canvasSize.x = _calculatedWidth;
- _canvasSize.y = _calculatedHeight;
- }
- that.getRealWidth = function () {
- return video.videoWidth;
- };
+ var maxLabel = this._rasterizeAngularSimilarity(patchesFound);
- that.getRealHeight = function () {
- return video.videoHeight;
- };
+ if (maxLabel < 1) {
+ return null;
+ } // search for area with the most patches (biggest connected area)
- that.getWidth = function () {
- return _calculatedWidth;
- };
- that.getHeight = function () {
- return _calculatedHeight;
- };
+ var topLabels = this._findBiggestConnectedAreas(maxLabel);
- that.setWidth = function (width) {
- _calculatedWidth = width;
- };
+ if (topLabels.length === 0) {
+ return null;
+ }
- that.setHeight = function (height) {
- _calculatedHeight = height;
- };
+ var boxes = this._findBoxes(topLabels, maxLabel);
- that.setInputStream = function (config) {
- _config = config;
- video.src = typeof config.src !== 'undefined' ? config.src : '';
- };
+ return boxes;
+ }
+ }, {
+ key: "_initBuffers",
+ value: function _initBuffers() {
+ if (this._config.halfSample) {
+ this._currentImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"]({
+ x: this._inputImageWrapper.size.x / 2 | 0,
+ y: this._inputImageWrapper.size.y / 2 | 0
+ });
+ } else {
+ this._currentImageWrapper = this._inputImageWrapper;
+ }
- that.ended = function () {
- return video.ended;
- };
+ this._patchSize = Object(_input_input_stream_utils__WEBPACK_IMPORTED_MODULE_7__["calculatePatchSize"])(this._config.patchSize, this._currentImageWrapper.size);
+ this._numPatches.x = this._currentImageWrapper.size.x / this._patchSize.x | 0;
+ this._numPatches.y = this._currentImageWrapper.size.y / this._patchSize.y | 0;
+ this._binaryImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](this._currentImageWrapper.size, undefined, Uint8Array, false);
+ this._labelImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](this._patchSize, undefined, Array, true);
+ var skeletonImageData = new ArrayBuffer(64 * 1024);
+ this._subImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](this._patchSize, new Uint8Array(skeletonImageData, 0, this._patchSize.x * this._patchSize.y));
+ this._skelImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](this._patchSize, new Uint8Array(skeletonImageData, this._patchSize.x * this._patchSize.y * 3, this._patchSize.x * this._patchSize.y), undefined, true);
+ this._skeletonizer = Object(_skeletonizer__WEBPACK_IMPORTED_MODULE_10__["default"])(typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : global, {
+ size: this._patchSize.x
+ }, skeletonImageData);
+ var size = {
+ x: this._currentImageWrapper.size.x / this._subImageWrapper.size.x | 0,
+ y: this._currentImageWrapper.size.y / this._subImageWrapper.size.y | 0
+ };
+ this._patchLabelGrid = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](size, undefined, Int32Array, true);
+ this._patchGrid = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_6__["ImageWrapper"](size, undefined, undefined, true);
+ this._imageToPatchGrid = new Array(this._patchLabelGrid.data.length);
+ }
+ }, {
+ key: "_initCanvas",
+ value: function _initCanvas() {
+ if (this._config.useWorker || typeof document === 'undefined') {
+ return;
+ }
- that.getConfig = function () {
- return _config;
- };
+ var canvas = document.createElement('canvas');
+ canvas.className = 'binaryBuffer';
+ canvas.width = this._binaryImageWrapper.size.x;
+ canvas.height = this._binaryImageWrapper.size.y;
- that.setAttribute = function (name, value) {
- video.setAttribute(name, value);
- };
+ if ( true && this._config.debug && this._config.debug.showCanvas) {
+ document.querySelector('#debug').appendChild(canvas);
+ }
- that.pause = function () {
- video.pause();
- };
+ this._binaryContext = canvas.getContext('2d');
+ }
+ /**
+ * Creates a bounding box which encloses all the given patches
+ * @returns The minimal bounding box
+ */
- that.play = function () {
- video.play();
- };
+ }, {
+ key: "_boxFromPatches",
+ value: function _boxFromPatches(patches) {
+ var _this = this;
- that.setCurrentTime = function (time) {
- if (_config.type !== "LiveStream") {
- video.currentTime = time;
- }
- };
+ var debug = true && this._config.debug;
+ var averageRad = patches.reduce(function (sum, _ref) {
+ var pos = _ref.pos,
+ rad = _ref.rad;
- that.addEventListener = function (event, f, bool) {
- if (_eventNames.indexOf(event) !== -1) {
- if (!_eventHandlers[event]) {
- _eventHandlers[event] = [];
- }
- _eventHandlers[event].push(f);
- } else {
- video.addEventListener(event, f, bool);
+ if (debug && debug.showPatches) {
+ // draw all patches which are to be taken into consideration
+ _this._drawRect(pos, _this._subImageWrapper.size, 'red', 1);
}
- };
- that.clearEventHandlers = function () {
- _eventNames.forEach(function (eventName) {
- var handlers = _eventHandlers[eventName];
- if (handlers && handlers.length > 0) {
- handlers.forEach(function (handler) {
- video.removeEventListener(eventName, handler);
- });
- }
- });
- };
+ return sum + rad;
+ }, 0) / patches.length;
+ averageRad = (averageRad * 180 / Math.PI + 90) % 180 - 90;
- that.trigger = function (eventName, args) {
- var j,
- handlers = _eventHandlers[eventName];
+ if (averageRad < 0) {
+ averageRad += 180;
+ }
+
+ averageRad = (180 - averageRad) * Math.PI / 180;
+ var cos = Math.cos(averageRad);
+ var sin = Math.sin(averageRad);
+ var matrix = new Float32Array([cos, sin, -sin, cos]);
+ var inverseMatrix = Object(_barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__["invert"])(matrix); // iterate over patches and rotate by angle
- if (eventName === 'canrecord') {
- initSize();
+ patches.forEach(function (_ref2) {
+ var box = _ref2.box;
+
+ for (var j = 0; j < 4; j++) {
+ box[j] = Object(_barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__["transformWithMatrix"])(box[j], matrix);
}
- if (handlers && handlers.length > 0) {
- for (j = 0; j < handlers.length; j++) {
- handlers[j].apply(that, args);
- }
+
+ if (debug && debug.boxFromPatches.showTransformed) {
+ _this._drawPath(box, '#99ff00', 2);
}
- };
+ });
+ var minX = this._binaryImageWrapper.size.x;
+ var minY = this._binaryImageWrapper.size.y;
+ var maxX = -minX;
+ var maxY = -minY; // find bounding box
- that.setTopRight = function (topRight) {
- _topRight.x = topRight.x;
- _topRight.y = topRight.y;
- };
+ patches.forEach(function (_ref3) {
+ var box = _ref3.box;
+ box.forEach(function (_ref4) {
+ var x = _ref4.x,
+ y = _ref4.y;
- that.getTopRight = function () {
- return _topRight;
- };
+ if (x < minX) {
+ minX = x;
+ }
- that.setCanvasSize = function (size) {
- _canvasSize.x = size.x;
- _canvasSize.y = size.y;
- };
+ if (x > maxX) {
+ maxX = x;
+ }
- that.getCanvasSize = function () {
- return _canvasSize;
- };
+ if (y < minY) {
+ minY = y;
+ }
- that.getFrame = function () {
- return video;
- };
+ if (y > maxY) {
+ maxY = y;
+ }
+ });
+ });
+ var box = [{
+ x: minX,
+ y: minY
+ }, {
+ x: maxX,
+ y: minY
+ }, {
+ x: maxX,
+ y: maxY
+ }, {
+ x: minX,
+ y: maxY
+ }];
+
+ if (debug && debug.boxFromPatches.showTransformedBox) {
+ this._drawPath(box, '#ff0000', 2);
+ } // reverse rotation
+
+
+ box = box.map(function (vertex) {
+ return Object(_barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__["transformWithMatrix"])(vertex, inverseMatrix);
+ });
+
+ if (debug && debug.boxFromPatches.showBB) {
+ this._drawPath(box, '#ff0000', 2);
+ }
- return that;
-};
+ if (this._config.halfSample) {
+ // scale
+ box = box.map(function (_ref5) {
+ var x = _ref5.x,
+ y = _ref5.y;
+ return {
+ x: x * 2,
+ y: y *= 2
+ };
+ });
+ }
-InputStream.createLiveStream = function (video) {
- video.setAttribute("autoplay", true);
- var that = InputStream.createVideoStream(video);
+ return box;
+ }
+ /**
+ * Creates a binary image of the current image
+ */
- that.ended = function () {
- return false;
- };
+ }, {
+ key: "_binarizeImage",
+ value: function _binarizeImage() {
+ Object(_barcode_locator_utils__WEBPACK_IMPORTED_MODULE_8__["otsuThreshold"])(this._currentImageWrapper, this._binaryImageWrapper);
- return that;
-};
+ this._binaryImageWrapper.zeroBorder();
-InputStream.createImageStream = function () {
- var that = {};
- var _config = null;
-
- var width = 0,
- height = 0,
- frameIdx = 0,
- paused = true,
- loaded = false,
- imgArray = null,
- size = 0,
- offset = 1,
- baseUrl = null,
- ended = false,
- calculatedWidth,
- calculatedHeight,
- _eventNames = ['canrecord', 'ended'],
- _eventHandlers = {},
- _topRight = { x: 0, y: 0 },
- _canvasSize = { x: 0, y: 0 };
-
- function loadImages() {
- loaded = false;
- __WEBPACK_IMPORTED_MODULE_0__image_loader__["a" /* default */].load(baseUrl, function (imgs) {
- imgArray = imgs;
- if (imgs[0].tags && imgs[0].tags.orientation) {
- switch (imgs[0].tags.orientation) {
- case 6:
- case 8:
- width = imgs[0].img.height;
- height = imgs[0].img.width;
- break;
- default:
- width = imgs[0].img.width;
- height = imgs[0].img.height;
- }
- } else {
- width = imgs[0].img.width;
- height = imgs[0].img.height;
- }
- calculatedWidth = _config.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width;
- calculatedHeight = _config.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height;
- _canvasSize.x = calculatedWidth;
- _canvasSize.y = calculatedHeight;
- loaded = true;
- frameIdx = 0;
- setTimeout(function () {
- publishEvent("canrecord", []);
- }, 0);
- }, offset, size, _config.sequence);
- }
-
- function publishEvent(eventName, args) {
- var j,
- handlers = _eventHandlers[eventName];
-
- if (handlers && handlers.length > 0) {
- for (j = 0; j < handlers.length; j++) {
- handlers[j].apply(that, args);
- }
- }
+ if ( true && this._config.debug && this._config.debug.showCanvas) {
+ this._binaryImageWrapper.show(this._binaryContext, 255);
+ }
}
+ /**
+ * Iterate over the entire image, extract patches
+ */
- that.trigger = publishEvent;
-
- that.getWidth = function () {
- return calculatedWidth;
- };
+ }, {
+ key: "_findPatches",
+ value: function _findPatches() {
+ var debug = true && this._config.debug;
+ var patchesFound = new Array();
- that.getHeight = function () {
- return calculatedHeight;
- };
+ for (var i = 0; i < this._numPatches.x; i++) {
+ for (var j = 0; j < this._numPatches.y; j++) {
+ var x = this._subImageWrapper.size.x * i;
+ var y = this._subImageWrapper.size.y * j; // seperate parts
- that.setWidth = function (newWidth) {
- calculatedWidth = newWidth;
- };
+ this._skeletonize(x, y); // Rasterize, find individual bars
- that.setHeight = function (newHeight) {
- calculatedHeight = newHeight;
- };
- that.getRealWidth = function () {
- return width;
- };
+ this._skelImageWrapper.zeroBorder();
- that.getRealHeight = function () {
- return height;
- };
+ this._labelImageWrapper.data.fill(0);
- that.setInputStream = function (stream) {
- _config = stream;
- if (stream.sequence === false) {
- baseUrl = stream.src;
- size = 1;
- } else {
- baseUrl = stream.src;
- size = stream.length;
- }
- loadImages();
- };
+ var rasterizer = new _rasterizer__WEBPACK_IMPORTED_MODULE_9__["Rasterizer"](this._skelImageWrapper, this._labelImageWrapper);
+ var rasterResult = rasterizer.rasterize(0);
- that.ended = function () {
- return ended;
- };
+ if (debug && debug.showLabels) {
+ this._labelImageWrapper.overlay(this._binaryContext, 360 / rasterResult.count | 0, x, y);
+ } // calculate moments from the skeletonized patch
- that.setAttribute = function () {};
- that.getConfig = function () {
- return _config;
- };
+ var moments = this._labelImageWrapper.moments(rasterResult.count); // extract eligible patches
- that.pause = function () {
- paused = true;
- };
- that.play = function () {
- paused = false;
- };
+ var patch = this._describePatch(moments, j * this._numPatches.x + i, x, y);
- that.setCurrentTime = function (time) {
- frameIdx = time;
- };
+ if (patch) {
+ patchesFound.push(patch);
- that.addEventListener = function (event, f) {
- if (_eventNames.indexOf(event) !== -1) {
- if (!_eventHandlers[event]) {
- _eventHandlers[event] = [];
+ if (debug && debug.showFoundPatches) {
+ this._drawRect(patch.pos, this._subImageWrapper.size, '#99ff00', 2);
}
- _eventHandlers[event].push(f);
+ }
}
- };
+ }
- that.setTopRight = function (topRight) {
- _topRight.x = topRight.x;
- _topRight.y = topRight.y;
- };
+ return patchesFound;
+ }
+ /**
+ * Finds those connected areas which contain at least 6 patches
+ * and returns them ordered DESC by the number of contained patches
+ * @param maxLabel
+ */
- that.getTopRight = function () {
- return _topRight;
- };
+ }, {
+ key: "_findBiggestConnectedAreas",
+ value: function _findBiggestConnectedAreas(maxLabel) {
+ var labelHist = new Array(maxLabel).fill(0);
- that.setCanvasSize = function (canvasSize) {
- _canvasSize.x = canvasSize.x;
- _canvasSize.y = canvasSize.y;
- };
+ this._patchLabelGrid.data.forEach(function (data) {
+ if (data > 0) {
+ labelHist[data - 1]++;
+ }
+ }); // extract top areas with at least 6 patches present
- that.getCanvasSize = function () {
- return _canvasSize;
- };
- that.getFrame = function () {
- var frame;
+ var topLabels = labelHist.map(function (value, index) {
+ return {
+ value: value,
+ index: index
+ };
+ }).filter(function (_ref6) {
+ var value = _ref6.value;
+ return value >= 5;
+ }).sort(function (a, b) {
+ return b.value - a.value;
+ }).map(function (_ref7) {
+ var index = _ref7.index;
+ return index + 1;
+ });
+ return topLabels;
+ }
+ /**
+ *
+ */
+
+ }, {
+ key: "_findBoxes",
+ value: function _findBoxes(topLabels, maxLabel) {
+ var _this2 = this;
- if (!loaded) {
- return null;
- }
- if (!paused) {
- frame = imgArray[frameIdx];
- if (frameIdx < size - 1) {
- frameIdx++;
- } else {
- setTimeout(function () {
- ended = true;
- publishEvent("ended", []);
- }, 0);
- }
- }
- return frame;
- };
+ var boxes = new Array();
+ var showRemainingPatchLabels = true && this._config.debug && this._config.debug.showRemainingPatchLabels;
+ topLabels.forEach(function (label) {
+ var patches = new Array();
- return that;
-};
+ _this2._patchLabelGrid.data.forEach(function (data, index) {
+ if (data === label) {
+ patches.push(_this2._imageToPatchGrid[index]);
+ }
+ });
-/* harmony default export */ __webpack_exports__["a"] = InputStream;
+ var box = _this2._boxFromPatches(patches);
-/***/ }),
-/* 64 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ if (box) {
+ boxes.push(box);
-"use strict";
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__ = __webpack_require__(20);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_cv_utils__ = __webpack_require__(19);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__common_array_helper__ = __webpack_require__(3);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__common_image_debug__ = __webpack_require__(9);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__rasterizer__ = __webpack_require__(65);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__tracer__ = __webpack_require__(30);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__skeletonizer__ = __webpack_require__(66);
+ if (showRemainingPatchLabels) {
+ // draw patch-labels if requested
+ var hsv = [label / (maxLabel + 1) * 360, 1, 1];
+ var rgb = [0, 0, 0];
+ Object(_common_hsv2rgb__WEBPACK_IMPORTED_MODULE_4__["hsv2rgb"])(hsv, rgb);
+ var color = "rgb(".concat(rgb.join(','), ")");
+ patches.forEach(function (_ref8) {
+ var pos = _ref8.pos;
+ return _this2._drawRect(pos, _this2._subImageWrapper.size, color, 2);
+ });
+ }
+ }
+ });
+ return boxes;
+ }
+ /**
+ * Find similar moments (via cluster)
+ * @param moments
+ */
+ }, {
+ key: "_similarMoments",
+ value: function _similarMoments(moments) {
+ var clusters = _common_cluster__WEBPACK_IMPORTED_MODULE_3__["Cluster"].clusterize(moments, MomentSimilarityThreshold);
+ var topCluster = clusters.reduce(function (top, item) {
+ var count = item.moments.length;
+ return count > top.count ? {
+ item: item,
+ count: count
+ } : top;
+ }, {
+ item: {
+ moments: []
+ },
+ count: 0
+ });
+ var result = topCluster.item.moments;
+ return result;
+ }
+ }, {
+ key: "_skeletonize",
+ value: function _skeletonize(x, y) {
+ this._binaryImageWrapper.subImageAsCopy(this._subImageWrapper, x, y);
+ this._skeletonizer.skeletonize(); // Show skeleton if requested
+ if ( true && this._config.debug && this._config.debug.showSkeleton) {
+ this._skelImageWrapper.overlay(this._binaryContext, 360, x, y);
+ }
+ }
+ /**
+ * Extracts and describes those patches which seem to contain a barcode pattern
+ * @param moments
+ * @param index
+ * @param x
+ * @param y
+ * @returns list of patches
+ */
+ }, {
+ key: "_describePatch",
+ value: function _describePatch(moments, index, x, y) {
+ if (moments.length > 1) {
+ var minComponentWeight = Math.ceil(this._patchSize.x / 3); // only collect moments which area covers at least minComponentWeight pixels
+ var eligibleMoments = moments.filter(function (moment) {
+ return moment.m00 > minComponentWeight;
+ }); // if at least 2 moments are found which have at least minComponentWeights covered
-var vec2 = {
- clone: __webpack_require__(7),
- dot: __webpack_require__(32),
- scale: __webpack_require__(81),
- transformMat2: __webpack_require__(82)
-};
-var mat2 = {
- copy: __webpack_require__(78),
- create: __webpack_require__(79),
- invert: __webpack_require__(80)
-};
+ if (eligibleMoments.length > 1) {
+ var matchingMoments = this._similarMoments(eligibleMoments);
-var _config,
- _currentImageWrapper,
- _skelImageWrapper,
- _subImageWrapper,
- _labelImageWrapper,
- _patchGrid,
- _patchLabelGrid,
- _imageToPatchGrid,
- _binaryImageWrapper,
- _patchSize,
- _canvasContainer = {
- ctx: {
- binary: null
- },
- dom: {
- binary: null
- }
-},
- _numPatches = { x: 0, y: 0 },
- _inputImageWrapper,
- _skeletonizer;
+ var length = matchingMoments.length | 0; // Only two of the moments are allowed not to fit into the equation
-function initBuffers() {
- var skeletonImageData;
+ if (length > 1 && length << 2 >= eligibleMoments.length * 3 && length << 2 > moments.length) {
+ // determine the similarity of the moments
+ var rad = matchingMoments.reduce(function (sum, moment) {
+ return sum + moment.rad;
+ }, 0) / length;
+ return {
+ index: index,
+ pos: {
+ x: x,
+ y: y
+ },
+ box: [{
+ x: x,
+ y: y
+ }, {
+ x: x + this._subImageWrapper.size.x,
+ y: y
+ }, {
+ x: x + this._subImageWrapper.size.x,
+ y: y + this._subImageWrapper.size.y
+ }, {
+ x: x,
+ y: y + this._subImageWrapper.size.y
+ }],
+ moments: matchingMoments,
+ rad: rad,
+ x: Math.cos(rad),
+ y: Math.sin(rad)
+ };
+ }
+ }
+ }
- if (_config.halfSample) {
- _currentImageWrapper = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */]({
- x: _inputImageWrapper.size.x / 2 | 0,
- y: _inputImageWrapper.size.y / 2 | 0
- });
- } else {
- _currentImageWrapper = _inputImageWrapper;
+ return null;
}
+ }, {
+ key: "_notYetProcessed",
+ value: function _notYetProcessed() {
+ for (var i = 0; i < this._patchLabelGrid.data.length; i++) {
+ if (this._patchLabelGrid.data[i] === 0 && this._patchGrid.data[i] === 1) {
+ return i;
+ }
+ }
- _patchSize = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["e" /* calculatePatchSize */])(_config.patchSize, _currentImageWrapper.size);
-
- _numPatches.x = _currentImageWrapper.size.x / _patchSize.x | 0;
- _numPatches.y = _currentImageWrapper.size.y / _patchSize.y | 0;
+ return this._patchLabelGrid.data.length;
+ }
+ }, {
+ key: "_trace",
+ value: function _trace(currentIndex, label) {
+ var _this3 = this;
- _binaryImageWrapper = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_currentImageWrapper.size, undefined, Uint8Array, false);
+ var threshold = 0.95;
+ var current = {
+ x: currentIndex % this._patchLabelGrid.size.x,
+ y: currentIndex / this._patchLabelGrid.size.x | 0
+ };
- _labelImageWrapper = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_patchSize, undefined, Array, true);
+ if (currentIndex < this._patchLabelGrid.data.length) {
+ var currentPatch = this._imageToPatchGrid[currentIndex]; // assign label
- skeletonImageData = new ArrayBuffer(64 * 1024);
- _subImageWrapper = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_patchSize, new Uint8Array(skeletonImageData, 0, _patchSize.x * _patchSize.y));
- _skelImageWrapper = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_patchSize, new Uint8Array(skeletonImageData, _patchSize.x * _patchSize.y * 3, _patchSize.x * _patchSize.y), undefined, true);
- _skeletonizer = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__skeletonizer__["a" /* default */])(typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : global, {
- size: _patchSize.x
- }, skeletonImageData);
+ this._patchLabelGrid.data[currentIndex] = label;
+ _tracer__WEBPACK_IMPORTED_MODULE_11__["SearchDirections"].forEach(function (direction) {
+ var y = current.y + direction[0];
+ var x = current.x + direction[1];
+ var index = y * _this3._patchLabelGrid.size.x + x; // continue if patch empty
- _imageToPatchGrid = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */]({
- x: _currentImageWrapper.size.x / _subImageWrapper.size.x | 0,
- y: _currentImageWrapper.size.y / _subImageWrapper.size.y | 0
- }, undefined, Array, true);
- _patchGrid = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_imageToPatchGrid.size, undefined, undefined, true);
- _patchLabelGrid = new __WEBPACK_IMPORTED_MODULE_0__common_image_wrapper__["a" /* default */](_imageToPatchGrid.size, undefined, Int32Array, true);
-}
+ if (_this3._patchGrid.data[index] === 0) {
+ _this3._patchLabelGrid.data[index] = Number.MAX_VALUE;
+ } else if (_this3._patchLabelGrid.data[index] === 0) {
+ var patch = _this3._imageToPatchGrid[index];
+ var similarity = Math.abs(patch.x * currentPatch.x + patch.y * currentPatch.y);
-function initCanvas() {
- if (_config.useWorker || typeof document === 'undefined') {
- return;
+ if (similarity > threshold) {
+ _this3._trace(index, label);
+ }
+ }
+ });
+ }
}
- _canvasContainer.dom.binary = document.createElement("canvas");
- _canvasContainer.dom.binary.className = "binaryBuffer";
- if (true && _config.debug.showCanvas === true) {
- document.querySelector("#debug").appendChild(_canvasContainer.dom.binary);
- }
- _canvasContainer.ctx.binary = _canvasContainer.dom.binary.getContext("2d");
- _canvasContainer.dom.binary.width = _binaryImageWrapper.size.x;
- _canvasContainer.dom.binary.height = _binaryImageWrapper.size.y;
-}
+ /**
+ * Finds patches which are connected and share the same orientation
+ * @param patchesFound
+ */
-/**
- * Creates a bounding box which encloses all the given patches
- * @returns {Array} The minimal bounding box
- */
-function boxFromPatches(patches) {
- var overAvg,
- i,
- j,
- patch,
- transMat,
- minx = _binaryImageWrapper.size.x,
- miny = _binaryImageWrapper.size.y,
- maxx = -_binaryImageWrapper.size.x,
- maxy = -_binaryImageWrapper.size.y,
- box,
- scale;
+ }, {
+ key: "_rasterizeAngularSimilarity",
+ value: function _rasterizeAngularSimilarity(patchesFound) {
+ var _this4 = this;
- // draw all patches which are to be taken into consideration
- overAvg = 0;
- for (i = 0; i < patches.length; i++) {
- patch = patches[i];
- overAvg += patch.rad;
- if (true && _config.debug.showPatches) {
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "red" });
- }
- }
+ var label = 0;
+ var hsv = [0, 1, 1];
+ var rgb = [0, 0, 0]; // prepare for finding the right patches
- overAvg /= patches.length;
- overAvg = (overAvg * 180 / Math.PI + 90) % 180 - 90;
- if (overAvg < 0) {
- overAvg += 180;
- }
+ this._patchGrid.data.fill(0);
- overAvg = (180 - overAvg) * Math.PI / 180;
- transMat = mat2.copy(mat2.create(), [Math.cos(overAvg), Math.sin(overAvg), -Math.sin(overAvg), Math.cos(overAvg)]);
+ this._patchLabelGrid.data.fill(0);
- // iterate over patches and rotate by angle
- for (i = 0; i < patches.length; i++) {
- patch = patches[i];
- for (j = 0; j < 4; j++) {
- vec2.transformMat2(patch.box[j], patch.box[j], transMat);
- }
+ this._imageToPatchGrid.fill(null);
+
+ patchesFound.forEach(function (patch) {
+ _this4._imageToPatchGrid[patch.index] = patch;
+ _this4._patchGrid.data[patch.index] = 1;
+ }); // rasterize the patches found to determine area
+
+ this._patchGrid.zeroBorder();
+
+ var currentIndex = 0;
+
+ while ((currentIndex = this._notYetProcessed()) < this._patchLabelGrid.data.length) {
+ label++;
+
+ this._trace(currentIndex, label);
+ } // draw patch-labels if requested
- if (true && _config.debug.boxFromPatches.showTransformed) {
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawPath(patch.box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#99ff00', lineWidth: 2 });
+
+ if ( true && this._config.debug && this._config.debug.showPatchLabels) {
+ for (var j = 0; j < this._patchLabelGrid.data.length; j++) {
+ if (this._patchLabelGrid.data[j] > 0 && this._patchLabelGrid.data[j] <= label) {
+ var patch = this._imageToPatchGrid[j];
+ hsv[0] = this._patchLabelGrid.data[j] / (label + 1) * 360;
+ Object(_common_hsv2rgb__WEBPACK_IMPORTED_MODULE_4__["hsv2rgb"])(hsv, rgb);
+
+ this._drawRect(patch.pos, this._subImageWrapper.size, "rgb(".concat(rgb.join(','), ")"), 2);
+ }
}
+ }
+
+ return label;
}
+ }, {
+ key: "_drawRect",
+ value: function _drawRect(_ref9, size, color, lineWidth) {
+ var x = _ref9.x,
+ y = _ref9.y;
+ this._binaryContext.strokeStyle = color;
+ this._binaryContext.fillStyle = color;
+ this._binaryContext.lineWidth = lineWidth || 1;
- // find bounding box
- for (i = 0; i < patches.length; i++) {
- patch = patches[i];
- for (j = 0; j < 4; j++) {
- if (patch.box[j][0] < minx) {
- minx = patch.box[j][0];
- }
- if (patch.box[j][0] > maxx) {
- maxx = patch.box[j][0];
- }
- if (patch.box[j][1] < miny) {
- miny = patch.box[j][1];
- }
- if (patch.box[j][1] > maxy) {
- maxy = patch.box[j][1];
- }
- }
+ this._binaryContext.strokeRect(x, y, size.x, size.y);
+ }
+ }, {
+ key: "_drawPath",
+ value: function _drawPath(path, color, lineWidth) {
+ _common_image_debug__WEBPACK_IMPORTED_MODULE_5__["ImageDebug"].drawPath(path, this._binaryContext, color, lineWidth);
}
+ }]);
- box = [[minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy]];
+ return BarcodeLocator;
+}();
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
- if (true && _config.debug.boxFromPatches.showTransformedBox) {
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawPath(box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#ff0000', lineWidth: 2 });
- }
+/***/ }),
- scale = _config.halfSample ? 2 : 1;
- // reverse rotation;
- transMat = mat2.invert(transMat, transMat);
- for (j = 0; j < 4; j++) {
- vec2.transformMat2(box[j], box[j], transMat);
- }
+/***/ "./src/locator/rasterizer.ts":
+/*!***********************************!*\
+ !*** ./src/locator/rasterizer.ts ***!
+ \***********************************/
+/*! exports provided: Rasterizer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- if (true && _config.debug.boxFromPatches.showBB) {
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawPath(box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#ff0000', lineWidth: 2 });
- }
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rasterizer", function() { return Rasterizer; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _tracer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tracer */ "./src/locator/tracer.ts");
- for (j = 0; j < 4; j++) {
- vec2.scale(box[j], box[j], scale);
- }
- return box;
-}
-/**
- * Creates a binary image of the current image
- */
-function binarizeImage() {
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["f" /* otsuThreshold */])(_currentImageWrapper, _binaryImageWrapper);
- _binaryImageWrapper.zeroBorder();
- if (true && _config.debug.showCanvas) {
- _binaryImageWrapper.show(_canvasContainer.dom.binary, 255);
- }
-}
/**
- * Iterate over the entire image
- * extract patches
+ * @borrows http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
*/
-function findPatches() {
- var i,
- j,
- x,
- y,
- moments,
- patchesFound = [],
- rasterizer,
- rasterResult,
- patch;
- for (i = 0; i < _numPatches.x; i++) {
- for (j = 0; j < _numPatches.y; j++) {
- x = _subImageWrapper.size.x * i;
- y = _subImageWrapper.size.y * j;
-
- // seperate parts
- skeletonize(x, y);
-
- // Rasterize, find individual bars
- _skelImageWrapper.zeroBorder();
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(_labelImageWrapper.data, 0);
- rasterizer = __WEBPACK_IMPORTED_MODULE_4__rasterizer__["a" /* default */].create(_skelImageWrapper, _labelImageWrapper);
- rasterResult = rasterizer.rasterize(0);
-
- if (true && _config.debug.showLabels) {
- _labelImageWrapper.overlay(_canvasContainer.dom.binary, Math.floor(360 / rasterResult.count), { x: x, y: y });
- }
- // calculate moments from the skeletonized patch
- moments = _labelImageWrapper.moments(rasterResult.count);
+var EdgeLabel;
- // extract eligible patches
- patchesFound = patchesFound.concat(describePatch(moments, [i, j], x, y));
- }
- }
+(function (EdgeLabel) {
+ EdgeLabel[EdgeLabel["Outside"] = -32767] = "Outside";
+ EdgeLabel[EdgeLabel["Inside"] = -32766] = "Inside";
+})(EdgeLabel || (EdgeLabel = {}));
- if (true && _config.debug.showFoundPatches) {
- for (i = 0; i < patchesFound.length; i++) {
- patch = patchesFound[i];
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "#99ff00", lineWidth: 2 });
- }
- }
+;
+var ContourDirection;
- return patchesFound;
-}
+(function (ContourDirection) {
+ ContourDirection[ContourDirection["CW"] = 0] = "CW";
+ ContourDirection[ContourDirection["CCW"] = 1] = "CCW";
+ ContourDirection[ContourDirection["Unknown"] = 2] = "Unknown";
+})(ContourDirection || (ContourDirection = {}));
-/**
- * Finds those connected areas which contain at least 6 patches
- * and returns them ordered DESC by the number of contained patches
- * @param {Number} maxLabel
- */
-function findBiggestConnectedAreas(maxLabel) {
- var i,
- sum,
- labelHist = [],
- topLabels = [];
+;
+var Rasterizer =
+/*#__PURE__*/
+function () {
+ function Rasterizer(imageWrapper, labelWrapper) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Rasterizer);
- for (i = 0; i < maxLabel; i++) {
- labelHist.push(0);
- }
- sum = _patchLabelGrid.data.length;
- while (sum--) {
- if (_patchLabelGrid.data[sum] > 0) {
- labelHist[_patchLabelGrid.data[sum] - 1]++;
- }
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_width", void 0);
- labelHist = labelHist.map(function (val, idx) {
- return {
- val: val,
- label: idx + 1
- };
- });
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_height", void 0);
- labelHist.sort(function (a, b) {
- return b.val - a.val;
- });
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_tracer", void 0);
- // extract top areas with at least 6 patches present
- topLabels = labelHist.filter(function (el) {
- return el.val >= 5;
- });
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_imageData", void 0);
- return topLabels;
-}
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_labelData", void 0);
-/**
- *
- */
-function findBoxes(topLabels, maxLabel) {
- var i,
- j,
- sum,
- patches = [],
- patch,
- box,
- boxes = [],
- hsv = [0, 1, 1],
- rgb = [0, 0, 0];
-
- for (i = 0; i < topLabels.length; i++) {
- sum = _patchLabelGrid.data.length;
- patches.length = 0;
- while (sum--) {
- if (_patchLabelGrid.data[sum] === topLabels[i].label) {
- patch = _imageToPatchGrid.data[sum];
- patches.push(patch);
- }
- }
- box = boxFromPatches(patches);
- if (box) {
- boxes.push(box);
+ this._imageData = imageWrapper.data;
+ this._labelData = labelWrapper.data;
+ this._width = imageWrapper.size.x;
+ this._height = imageWrapper.size.y;
+ this._tracer = new _tracer__WEBPACK_IMPORTED_MODULE_3__["Tracer"](imageWrapper, labelWrapper);
+ }
- // draw patch-labels if requested
- if (true && _config.debug.showRemainingPatchLabels) {
- for (j = 0; j < patches.length; j++) {
- patch = patches[j];
- hsv[0] = topLabels[i].label / (maxLabel + 1) * 360;
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["a" /* hsv2rgb */])(hsv, rgb);
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "rgb(" + rgb.join(",") + ")", lineWidth: 2 });
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Rasterizer, [{
+ key: "rasterize",
+ value: function rasterize(depthLabel) {
+ var colorMap = new Array();
+
+ for (var i = 0; i < 400; i++) {
+ colorMap[i] = 0;
+ }
+
+ colorMap[0] = this._imageData[0];
+ var cc = null;
+ var sc;
+ var connectedCount = 0;
+
+ for (var cy = 1; cy < this._height - 1; cy++) {
+ var labelIndex = 0;
+ var bc = colorMap[0];
+
+ for (var cx = 1; cx < this._width - 1; cx++) {
+ var pos = cy * this._width + cx;
+
+ if (this._labelData[pos] === 0) {
+ var color = this._imageData[pos];
+
+ if (color !== bc) {
+ if (labelIndex === 0) {
+ var lc = connectedCount + 1;
+ colorMap[lc] = color;
+ bc = color;
+
+ var vertex = this._tracer.contourTracing(cy, cx, lc, color, EdgeLabel.Outside);
+
+ if (vertex !== null) {
+ connectedCount++;
+ labelIndex = lc;
+ var p = {
+ dir: ContourDirection.CW,
+ index: labelIndex,
+ firstVertex: vertex,
+ nextPeer: cc,
+ insideContours: null
+ };
+
+ if (cc !== null) {
+ cc.previousPeer = p;
+ }
+
+ cc = p;
}
- }
- }
- }
- return boxes;
-}
+ } else {
+ var _vertex = this._tracer.contourTracing(cy, cx, EdgeLabel.Inside, color, labelIndex);
+
+ if (_vertex !== null) {
+ var _p = {
+ dir: depthLabel === 0 ? ContourDirection.CCW : ContourDirection.CW,
+ firstVertex: _vertex,
+ index: depthLabel,
+ insideContours: null
+ };
+ sc = cc;
+
+ while (sc !== null && sc.index !== labelIndex) {
+ sc = sc.nextPeer;
+ }
+
+ if (sc !== null) {
+ _p.nextPeer = sc.insideContours;
+
+ if (sc.insideContours !== null) {
+ sc.insideContours.previousPeer = _p;
+ }
-/**
- * Find similar moments (via cluster)
- * @param {Object} moments
- */
-function similarMoments(moments) {
- var clusters = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["g" /* cluster */])(moments, 0.90);
- var topCluster = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["h" /* topGeneric */])(clusters, 1, function (e) {
- return e.getPoints().length;
- });
- var points = [],
- result = [];
- if (topCluster.length === 1) {
- points = topCluster[0].item.getPoints();
- for (var i = 0; i < points.length; i++) {
- result.push(points[i].point);
+ sc.insideContours = _p;
+ }
+ }
+ }
+ } else {
+ this._labelData[pos] = labelIndex;
+ }
+ } else if (this._labelData[pos] === EdgeLabel.Inside) {
+ labelIndex = 0;
+ bc = this._imageData[pos];
+ } else if (this._labelData[pos] === EdgeLabel.Outside) {
+ labelIndex = 0;
+ bc = colorMap[0];
+ } else {
+ labelIndex = this._labelData[pos];
+ bc = colorMap[labelIndex];
+ }
}
- }
- return result;
-}
+ }
-function skeletonize(x, y) {
- _binaryImageWrapper.subImageAsCopy(_subImageWrapper, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["b" /* imageRef */])(x, y));
- _skeletonizer.skeletonize();
+ sc = cc;
- // Show skeleton if requested
- if (true && _config.debug.showSkeleton) {
- _skelImageWrapper.overlay(_canvasContainer.dom.binary, 360, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["b" /* imageRef */])(x, y));
- }
-}
+ while (sc !== null) {
+ sc.index = depthLabel;
+ sc = sc.nextPeer;
+ }
-/**
- * Extracts and describes those patches which seem to contain a barcode pattern
- * @param {Array} moments
- * @param {Object} patchPos,
- * @param {Number} x
- * @param {Number} y
- * @returns {Array} list of patches
- */
-function describePatch(moments, patchPos, x, y) {
- var k,
- avg,
- eligibleMoments = [],
- matchingMoments,
- patch,
- patchesFound = [],
- minComponentWeight = Math.ceil(_patchSize.x / 3);
-
- if (moments.length >= 2) {
- // only collect moments which's area covers at least minComponentWeight pixels.
- for (k = 0; k < moments.length; k++) {
- if (moments[k].m00 > minComponentWeight) {
- eligibleMoments.push(moments[k]);
- }
+ return {
+ cc: cc,
+ count: connectedCount
+ };
+ }
+ }, {
+ key: "drawContour",
+ value: function drawContour(canvas, firstContour) {
+ var context = canvas.getContext('2d');
+ context.strokeStyle = 'red';
+ context.fillStyle = 'red';
+ context.lineWidth = 1;
+ var pq = firstContour;
+ var iq = pq && pq.insideContours;
+
+ while (pq !== null) {
+ var q = iq || pq;
+
+ if (iq !== null) {
+ iq = iq.nextPeer;
+ } else {
+ pq = pq.nextPeer;
+ iq = pq && pq.insideContours;
}
- // if at least 2 moments are found which have at least minComponentWeights covered
- if (eligibleMoments.length >= 2) {
- matchingMoments = similarMoments(eligibleMoments);
- avg = 0;
- // determine the similarity of the moments
- for (k = 0; k < matchingMoments.length; k++) {
- avg += matchingMoments[k].rad;
+ switch (q.dir) {
+ case ContourDirection.CW:
+ {
+ context.strokeStyle = 'red';
+ break;
}
- // Only two of the moments are allowed not to fit into the equation
- // add the patch to the set
- if (matchingMoments.length > 1 && matchingMoments.length >= eligibleMoments.length / 4 * 3 && matchingMoments.length > moments.length / 4) {
- avg /= matchingMoments.length;
- patch = {
- index: patchPos[1] * _numPatches.x + patchPos[0],
- pos: {
- x: x,
- y: y
- },
- box: [vec2.clone([x, y]), vec2.clone([x + _subImageWrapper.size.x, y]), vec2.clone([x + _subImageWrapper.size.x, y + _subImageWrapper.size.y]), vec2.clone([x, y + _subImageWrapper.size.y])],
- moments: matchingMoments,
- rad: avg,
- vec: vec2.clone([Math.cos(avg), Math.sin(avg)])
- };
- patchesFound.push(patch);
+ case ContourDirection.CCW:
+ {
+ context.strokeStyle = 'blue';
+ break;
}
- }
- }
- return patchesFound;
-}
-/**
- * finds patches which are connected and share the same orientation
- * @param {Object} patchesFound
- */
-function rasterizeAngularSimilarity(patchesFound) {
- var label = 0,
- threshold = 0.95,
- currIdx = 0,
- j,
- patch,
- hsv = [0, 1, 1],
- rgb = [0, 0, 0];
-
- function notYetProcessed() {
- var i;
- for (i = 0; i < _patchLabelGrid.data.length; i++) {
- if (_patchLabelGrid.data[i] === 0 && _patchGrid.data[i] === 1) {
- return i;
+ case ContourDirection.Unknown:
+ {
+ context.strokeStyle = 'green';
+ break;
}
}
- return _patchLabelGrid.length;
+
+ var p = q.firstVertex;
+ context.beginPath();
+ context.moveTo(p.x, p.y);
+
+ do {
+ p = p.next;
+ context.lineTo(p.x, p.y);
+ } while (p !== q.firstVertex);
+
+ context.stroke();
+ }
}
+ }]);
- function trace(currentIdx) {
- var x,
- y,
- currentPatch,
- idx,
- dir,
- current = {
- x: currentIdx % _patchLabelGrid.size.x,
- y: currentIdx / _patchLabelGrid.size.x | 0
- },
- similarity;
-
- if (currentIdx < _patchLabelGrid.data.length) {
- currentPatch = _imageToPatchGrid.data[currentIdx];
- // assign label
- _patchLabelGrid.data[currentIdx] = label;
- for (dir = 0; dir < __WEBPACK_IMPORTED_MODULE_5__tracer__["a" /* default */].searchDirections.length; dir++) {
- y = current.y + __WEBPACK_IMPORTED_MODULE_5__tracer__["a" /* default */].searchDirections[dir][0];
- x = current.x + __WEBPACK_IMPORTED_MODULE_5__tracer__["a" /* default */].searchDirections[dir][1];
- idx = y * _patchLabelGrid.size.x + x;
-
- // continue if patch empty
- if (_patchGrid.data[idx] === 0) {
- _patchLabelGrid.data[idx] = Number.MAX_VALUE;
- continue;
- }
+ return Rasterizer;
+}();
- if (_patchLabelGrid.data[idx] === 0) {
- similarity = Math.abs(vec2.dot(_imageToPatchGrid.data[idx].vec, currentPatch.vec));
- if (similarity > threshold) {
- trace(idx);
- }
- }
- }
+/***/ }),
+
+/***/ "./src/locator/skeletonizer.js":
+/*!*************************************!*\
+ !*** ./src/locator/skeletonizer.js ***!
+ \*************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* eslint-disable eqeqeq */
+function Skeletonizer(stdlib, foreign, buffer) {
+ "use asm";
+
+ var images = new stdlib.Uint8Array(buffer),
+ size = foreign.size | 0,
+ imul = stdlib.Math.imul;
+
+ function erode(inImagePtr, outImagePtr) {
+ inImagePtr = inImagePtr | 0;
+ outImagePtr = outImagePtr | 0;
+ var v = 0,
+ u = 0,
+ sum = 0,
+ yStart1 = 0,
+ yStart2 = 0,
+ xStart1 = 0,
+ xStart2 = 0,
+ offset = 0;
+
+ for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
+ offset = offset + size | 0;
+
+ for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
+ yStart1 = offset - size | 0;
+ yStart2 = offset + size | 0;
+ xStart1 = u - 1 | 0;
+ xStart2 = u + 1 | 0;
+ sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
+
+ if ((sum | 0) == (5 | 0)) {
+ images[outImagePtr + offset + u | 0] = 1;
+ } else {
+ images[outImagePtr + offset + u | 0] = 0;
}
+ }
}
- // prepare for finding the right patches
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(_patchGrid.data, 0);
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(_patchLabelGrid.data, 0);
- __WEBPACK_IMPORTED_MODULE_2__common_array_helper__["a" /* default */].init(_imageToPatchGrid.data, null);
+ return;
+ }
+
+ function subtract(aImagePtr, bImagePtr, outImagePtr) {
+ aImagePtr = aImagePtr | 0;
+ bImagePtr = bImagePtr | 0;
+ outImagePtr = outImagePtr | 0;
+ var length = 0;
+ length = imul(size, size) | 0;
- for (j = 0; j < patchesFound.length; j++) {
- patch = patchesFound[j];
- _imageToPatchGrid.data[patch.index] = patch;
- _patchGrid.data[patch.index] = 1;
+ while ((length | 0) > 0) {
+ length = length - 1 | 0;
+ images[outImagePtr + length | 0] = (images[aImagePtr + length | 0] | 0) - (images[bImagePtr + length | 0] | 0) | 0;
}
+ }
- // rasterize the patches found to determine area
- _patchGrid.zeroBorder();
+ function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {
+ aImagePtr = aImagePtr | 0;
+ bImagePtr = bImagePtr | 0;
+ outImagePtr = outImagePtr | 0;
+ var length = 0;
+ length = imul(size, size) | 0;
- while ((currIdx = notYetProcessed()) < _patchLabelGrid.data.length) {
- label++;
- trace(currIdx);
+ while ((length | 0) > 0) {
+ length = length - 1 | 0;
+ images[outImagePtr + length | 0] = images[aImagePtr + length | 0] | 0 | (images[bImagePtr + length | 0] | 0) | 0;
}
+ }
- // draw patch-labels if requested
- if (true && _config.debug.showPatchLabels) {
- for (j = 0; j < _patchLabelGrid.data.length; j++) {
- if (_patchLabelGrid.data[j] > 0 && _patchLabelGrid.data[j] <= label) {
- patch = _imageToPatchGrid.data[j];
- hsv[0] = _patchLabelGrid.data[j] / (label + 1) * 360;
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["a" /* hsv2rgb */])(hsv, rgb);
- __WEBPACK_IMPORTED_MODULE_3__common_image_debug__["a" /* default */].drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "rgb(" + rgb.join(",") + ")", lineWidth: 2 });
- }
- }
- }
+ function countNonZero(imagePtr) {
+ imagePtr = imagePtr | 0;
+ var sum = 0,
+ length = 0;
+ length = imul(size, size) | 0;
- return label;
-}
+ while ((length | 0) > 0) {
+ length = length - 1 | 0;
+ sum = (sum | 0) + (images[imagePtr + length | 0] | 0) | 0;
+ }
-/* harmony default export */ __webpack_exports__["a"] = {
- init: function init(inputImageWrapper, config) {
- _config = config;
- _inputImageWrapper = inputImageWrapper;
+ return sum | 0;
+ }
- initBuffers();
- initCanvas();
- },
+ function init(imagePtr, value) {
+ imagePtr = imagePtr | 0;
+ value = value | 0;
+ var length = 0;
+ length = imul(size, size) | 0;
- locate: function locate() {
- var patchesFound, topLabels, boxes;
+ while ((length | 0) > 0) {
+ length = length - 1 | 0;
+ images[imagePtr + length | 0] = value;
+ }
+ }
- if (_config.halfSample) {
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["i" /* halfSample */])(_inputImageWrapper, _currentImageWrapper);
+ function dilate(inImagePtr, outImagePtr) {
+ inImagePtr = inImagePtr | 0;
+ outImagePtr = outImagePtr | 0;
+ var v = 0,
+ u = 0,
+ sum = 0,
+ yStart1 = 0,
+ yStart2 = 0,
+ xStart1 = 0,
+ xStart2 = 0,
+ offset = 0;
+
+ for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
+ offset = offset + size | 0;
+
+ for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
+ yStart1 = offset - size | 0;
+ yStart2 = offset + size | 0;
+ xStart1 = u - 1 | 0;
+ xStart2 = u + 1 | 0;
+ sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
+
+ if ((sum | 0) > (0 | 0)) {
+ images[outImagePtr + offset + u | 0] = 1;
+ } else {
+ images[outImagePtr + offset + u | 0] = 0;
}
+ }
+ }
- binarizeImage();
- patchesFound = findPatches();
- // return unless 5% or more patches are found
- if (patchesFound.length < _numPatches.x * _numPatches.y * 0.05) {
- return null;
- }
+ return;
+ }
- // rasterrize area by comparing angular similarity;
- var maxLabel = rasterizeAngularSimilarity(patchesFound);
- if (maxLabel < 1) {
- return null;
- }
+ function memcpy(srcImagePtr, dstImagePtr) {
+ srcImagePtr = srcImagePtr | 0;
+ dstImagePtr = dstImagePtr | 0;
+ var length = 0;
+ length = imul(size, size) | 0;
- // search for area with the most patches (biggest connected area)
- topLabels = findBiggestConnectedAreas(maxLabel);
- if (topLabels.length === 0) {
- return null;
- }
+ while ((length | 0) > 0) {
+ length = length - 1 | 0;
+ images[dstImagePtr + length | 0] = images[srcImagePtr + length | 0] | 0;
+ }
+ }
- boxes = findBoxes(topLabels, maxLabel);
- return boxes;
- },
+ function zeroBorder(imagePtr) {
+ imagePtr = imagePtr | 0;
+ var x = 0,
+ y = 0;
- checkImageConstraints: function checkImageConstraints(inputStream, config) {
- var patchSize,
- width = inputStream.getWidth(),
- height = inputStream.getHeight(),
- halfSample = config.halfSample ? 0.5 : 1,
- size,
- area;
-
- // calculate width and height based on area
- if (inputStream.getConfig().area) {
- area = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["j" /* computeImageArea */])(width, height, inputStream.getConfig().area);
- inputStream.setTopRight({ x: area.sx, y: area.sy });
- inputStream.setCanvasSize({ x: width, y: height });
- width = area.sw;
- height = area.sh;
- }
-
- size = {
- x: Math.floor(width * halfSample),
- y: Math.floor(height * halfSample)
- };
+ for (x = 0; (x | 0) < (size - 1 | 0); x = x + 1 | 0) {
+ images[imagePtr + x | 0] = 0;
+ images[imagePtr + y | 0] = 0;
+ y = y + size - 1 | 0;
+ images[imagePtr + y | 0] = 0;
+ y = y + 1 | 0;
+ }
- patchSize = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__common_cv_utils__["e" /* calculatePatchSize */])(config.patchSize, size);
- if (true) {
- console.log("Patch-Size: " + JSON.stringify(patchSize));
- }
+ for (x = 0; (x | 0) < (size | 0); x = x + 1 | 0) {
+ images[imagePtr + y | 0] = 0;
+ y = y + 1 | 0;
+ }
+ }
- inputStream.setWidth(Math.floor(Math.floor(size.x / patchSize.x) * (1 / halfSample) * patchSize.x));
- inputStream.setHeight(Math.floor(Math.floor(size.y / patchSize.y) * (1 / halfSample) * patchSize.y));
+ function skeletonize() {
+ var subImagePtr = 0,
+ erodedImagePtr = 0,
+ tempImagePtr = 0,
+ skelImagePtr = 0,
+ sum = 0,
+ done = 0;
+ erodedImagePtr = imul(size, size) | 0;
+ tempImagePtr = erodedImagePtr + erodedImagePtr | 0;
+ skelImagePtr = tempImagePtr + erodedImagePtr | 0; // init skel-image
- if (inputStream.getWidth() % patchSize.x === 0 && inputStream.getHeight() % patchSize.y === 0) {
- return true;
- }
+ init(skelImagePtr, 0);
+ zeroBorder(subImagePtr);
- throw new Error("Image dimensions do not comply with the current settings: Width (" + width + " )and height (" + height + ") must a multiple of " + patchSize.x);
- }
-};
-/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(47)))
+ do {
+ erode(subImagePtr, erodedImagePtr);
+ dilate(erodedImagePtr, tempImagePtr);
+ subtract(subImagePtr, tempImagePtr, tempImagePtr);
+ bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);
+ memcpy(erodedImagePtr, subImagePtr);
+ sum = countNonZero(subImagePtr) | 0;
+ done = (sum | 0) == 0 | 0;
+ } while (!done);
+ }
+
+ return {
+ skeletonize: skeletonize
+ };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (Skeletonizer);
+/* eslint-enable eqeqeq */
/***/ }),
-/* 65 */
+
+/***/ "./src/locator/tracer.ts":
+/*!*******************************!*\
+ !*** ./src/locator/tracer.ts ***!
+ \*******************************/
+/*! exports provided: SearchDirections, Tracer */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__tracer__ = __webpack_require__(30);
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchDirections", function() { return SearchDirections; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tracer", function() { return Tracer; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+
+
/**
- * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
+ * @borrows http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
*/
-var Rasterizer = {
- createContour2D: function createContour2D() {
- return {
- dir: null,
- index: null,
- firstVertex: null,
- insideContours: null,
- nextpeer: null,
- prevpeer: null
- };
- },
- CONTOUR_DIR: {
- CW_DIR: 0,
- CCW_DIR: 1,
- UNKNOWN_DIR: 2
- },
- DIR: {
- OUTSIDE_EDGE: -32767,
- INSIDE_EDGE: -32766
- },
- create: function create(imageWrapper, labelWrapper) {
- var imageData = imageWrapper.data,
- labelData = labelWrapper.data,
- width = imageWrapper.size.x,
- height = imageWrapper.size.y,
- tracer = __WEBPACK_IMPORTED_MODULE_0__tracer__["a" /* default */].create(imageWrapper, labelWrapper);
+var SearchDirections = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]];
+var Tracer =
+/*#__PURE__*/
+function () {
+ function Tracer(imageWrapper, labelWrapper) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Tracer);
- return {
- rasterize: function rasterize(depthlabel) {
- var color,
- bc,
- lc,
- labelindex,
- cx,
- cy,
- colorMap = [],
- vertex,
- p,
- cc,
- sc,
- pos,
- connectedCount = 0,
- i;
-
- for (i = 0; i < 400; i++) {
- colorMap[i] = 0;
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_imageData", void 0);
- colorMap[0] = imageData[0];
- cc = null;
- for (cy = 1; cy < height - 1; cy++) {
- labelindex = 0;
- bc = colorMap[0];
- for (cx = 1; cx < width - 1; cx++) {
- pos = cy * width + cx;
- if (labelData[pos] === 0) {
- color = imageData[pos];
- if (color !== bc) {
- if (labelindex === 0) {
- lc = connectedCount + 1;
- colorMap[lc] = color;
- bc = color;
- vertex = tracer.contourTracing(cy, cx, lc, color, Rasterizer.DIR.OUTSIDE_EDGE);
- if (vertex !== null) {
- connectedCount++;
- labelindex = lc;
- p = Rasterizer.createContour2D();
- p.dir = Rasterizer.CONTOUR_DIR.CW_DIR;
- p.index = labelindex;
- p.firstVertex = vertex;
- p.nextpeer = cc;
- p.insideContours = null;
- if (cc !== null) {
- cc.prevpeer = p;
- }
- cc = p;
- }
- } else {
- vertex = tracer.contourTracing(cy, cx, Rasterizer.DIR.INSIDE_EDGE, color, labelindex);
- if (vertex !== null) {
- p = Rasterizer.createContour2D();
- p.firstVertex = vertex;
- p.insideContours = null;
- if (depthlabel === 0) {
- p.dir = Rasterizer.CONTOUR_DIR.CCW_DIR;
- } else {
- p.dir = Rasterizer.CONTOUR_DIR.CW_DIR;
- }
- p.index = depthlabel;
- sc = cc;
- while (sc !== null && sc.index !== labelindex) {
- sc = sc.nextpeer;
- }
- if (sc !== null) {
- p.nextpeer = sc.insideContours;
- if (sc.insideContours !== null) {
- sc.insideContours.prevpeer = p;
- }
- sc.insideContours = p;
- }
- }
- }
- } else {
- labelData[pos] = labelindex;
- }
- } else if (labelData[pos] === Rasterizer.DIR.OUTSIDE_EDGE || labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) {
- labelindex = 0;
- if (labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) {
- bc = imageData[pos];
- } else {
- bc = colorMap[0];
- }
- } else {
- labelindex = labelData[pos];
- bc = colorMap[labelindex];
- }
- }
- }
- sc = cc;
- while (sc !== null) {
- sc.index = depthlabel;
- sc = sc.nextpeer;
- }
- return {
- cc: cc,
- count: connectedCount
- };
- },
- debug: {
- drawContour: function drawContour(canvas, firstContour) {
- var ctx = canvas.getContext("2d"),
- pq = firstContour,
- iq,
- q,
- p;
-
- ctx.strokeStyle = "red";
- ctx.fillStyle = "red";
- ctx.lineWidth = 1;
-
- if (pq !== null) {
- iq = pq.insideContours;
- } else {
- iq = null;
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_labelData", void 0);
- while (pq !== null) {
- if (iq !== null) {
- q = iq;
- iq = iq.nextpeer;
- } else {
- q = pq;
- pq = pq.nextpeer;
- if (pq !== null) {
- iq = pq.insideContours;
- } else {
- iq = null;
- }
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_width", void 0);
- switch (q.dir) {
- case Rasterizer.CONTOUR_DIR.CW_DIR:
- ctx.strokeStyle = "red";
- break;
- case Rasterizer.CONTOUR_DIR.CCW_DIR:
- ctx.strokeStyle = "blue";
- break;
- case Rasterizer.CONTOUR_DIR.UNKNOWN_DIR:
- ctx.strokeStyle = "green";
- break;
- }
+ this._imageData = imageWrapper.data;
+ this._labelData = labelWrapper.data;
+ this._width = imageWrapper.size.x;
+ }
- p = q.firstVertex;
- ctx.beginPath();
- ctx.moveTo(p.x, p.y);
- do {
- p = p.next;
- ctx.lineTo(p.x, p.y);
- } while (p !== q.firstVertex);
- ctx.stroke();
- }
- }
- }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Tracer, [{
+ key: "trace",
+ value: function trace(current, color, label, edgeLabel) {
+ for (var i = 0; i < 7; i++) {
+ var y = current.cy + SearchDirections[current.dir][0] | 0;
+ var x = current.cx + SearchDirections[current.dir][1] | 0;
+ var pos = y * this._width + x | 0;
+
+ if (this._imageData[pos] === color && (this._labelData[pos] === 0 || this._labelData[pos] === label)) {
+ this._labelData[pos] = label;
+ current.cx = x;
+ current.cy = y;
+ return true;
+ } else {
+ if (this._labelData[pos] === 0) {
+ this._labelData[pos] = edgeLabel;
+ }
+
+ current.dir = (current.dir + 1) % 8;
+ }
+ }
+
+ return false;
+ }
+ }, {
+ key: "contourTracing",
+ value: function contourTracing(sy, sx, label, color, edgeLabel) {
+ var Fv = null;
+ var current = {
+ cx: sx,
+ cy: sy,
+ dir: 0
+ };
+
+ if (this.trace(current, color, label, edgeLabel)) {
+ Fv = {
+ x: sx,
+ y: sy,
+ dir: current.dir,
+ next: null,
+ prev: null
+ };
+ var Cv = Fv;
+ var ldir = current.dir;
+ var P = {
+ x: current.cx,
+ y: current.cy,
+ dir: 0,
+ next: null,
+ prev: Cv
};
+ Cv.next = P;
+ Cv = P;
+
+ do {
+ current.dir = (current.dir + 6) % 8;
+ this.trace(current, color, label, edgeLabel);
+
+ if (ldir !== current.dir) {
+ Cv.dir = current.dir;
+ P = {
+ x: current.cx,
+ y: current.cy,
+ dir: 0,
+ next: null,
+ prev: Cv
+ };
+ Cv.next = P;
+ Cv = P;
+ } else {
+ Cv.dir = ldir;
+ Cv.x = current.cx;
+ Cv.y = current.cy;
+ }
+
+ ldir = current.dir;
+ } while (current.cx !== sx || current.cy !== sy);
+
+ Fv.prev = Cv.prev;
+ Cv.prev.next = Fv;
+ }
+
+ return Fv;
}
-};
+ }]);
-/* harmony default export */ __webpack_exports__["a"] = Rasterizer;
+ return Tracer;
+}();
/***/ }),
-/* 66 */
+
+/***/ "./src/quagga.ts":
+/*!***********************!*\
+ !*** ./src/quagga.ts ***!
+ \***********************/
+/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* @preserve ASM BEGIN */
-/* eslint-disable eqeqeq*/
-function Skeletonizer(stdlib, foreign, buffer) {
- "use asm";
-
- var images = new stdlib.Uint8Array(buffer),
- size = foreign.size | 0,
- imul = stdlib.Math.imul;
-
- function erode(inImagePtr, outImagePtr) {
- inImagePtr = inImagePtr | 0;
- outImagePtr = outImagePtr | 0;
-
- var v = 0,
- u = 0,
- sum = 0,
- yStart1 = 0,
- yStart2 = 0,
- xStart1 = 0,
- xStart2 = 0,
- offset = 0;
-
- for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
- offset = offset + size | 0;
- for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
- yStart1 = offset - size | 0;
- yStart2 = offset + size | 0;
- xStart1 = u - 1 | 0;
- xStart2 = u + 1 | 0;
- sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
- if ((sum | 0) == (5 | 0)) {
- images[outImagePtr + offset + u | 0] = 1;
- } else {
- images[outImagePtr + offset + u | 0] = 0;
- }
- }
- }
- return;
- }
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _analytics_result_collector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./analytics/result-collector */ "./src/analytics/result-collector.ts");
+/* harmony import */ var _common_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/events */ "./src/common/events.ts");
+/* harmony import */ var _common_image_debug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/image-debug */ "./src/common/image-debug.ts");
+/* harmony import */ var _common_image_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common/image-wrapper */ "./src/common/image-wrapper.ts");
+/* harmony import */ var _common_merge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./common/merge */ "./src/common/merge.ts");
+/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config/config */ "./src/config/config.dev.ts");
+/* harmony import */ var _decoder_barcode_decoder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./decoder/barcode-decoder */ "./src/decoder/barcode-decoder.ts");
+/* harmony import */ var _input_camera_access__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./input/camera-access */ "./src/input/camera-access.ts");
+/* harmony import */ var _input_frame_grabber__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input/frame-grabber */ "./src/input/frame-grabber.ts");
+/* harmony import */ var _input_image_stream__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./input/image-stream */ "./src/input/image-stream.ts");
+/* harmony import */ var _input_live_stream__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./input/live-stream */ "./src/input/live-stream.ts");
+/* harmony import */ var _input_video_stream__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./input/video-stream */ "./src/input/video-stream.ts");
+/* harmony import */ var _input_input_stream_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./input/input-stream-utils */ "./src/input/input-stream-utils.ts");
+/* harmony import */ var _locator_barcode_locator__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./locator/barcode-locator */ "./src/locator/barcode-locator.ts");
- function subtract(aImagePtr, bImagePtr, outImagePtr) {
- aImagePtr = aImagePtr | 0;
- bImagePtr = bImagePtr | 0;
- outImagePtr = outImagePtr | 0;
- var length = 0;
- length = imul(size, size) | 0;
- while ((length | 0) > 0) {
- length = length - 1 | 0;
- images[outImagePtr + length | 0] = (images[aImagePtr + length | 0] | 0) - (images[bImagePtr + length | 0] | 0) | 0;
- }
- }
- function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {
- aImagePtr = aImagePtr | 0;
- bImagePtr = bImagePtr | 0;
- outImagePtr = outImagePtr | 0;
- var length = 0;
- length = imul(size, size) | 0;
-
- while ((length | 0) > 0) {
- length = length - 1 | 0;
- images[outImagePtr + length | 0] = images[aImagePtr + length | 0] | 0 | (images[bImagePtr + length | 0] | 0) | 0;
- }
- }
- function countNonZero(imagePtr) {
- imagePtr = imagePtr | 0;
- var sum = 0,
- length = 0;
- length = imul(size, size) | 0;
- while ((length | 0) > 0) {
- length = length - 1 | 0;
- sum = (sum | 0) + (images[imagePtr + length | 0] | 0) | 0;
- }
- return sum | 0;
- }
- function init(imagePtr, value) {
- imagePtr = imagePtr | 0;
- value = value | 0;
- var length = 0;
- length = imul(size, size) | 0;
+var _inputStream;
- while ((length | 0) > 0) {
- length = length - 1 | 0;
- images[imagePtr + length | 0] = value;
- }
- }
+var _frameGrabber;
- function dilate(inImagePtr, outImagePtr) {
- inImagePtr = inImagePtr | 0;
- outImagePtr = outImagePtr | 0;
+var _stopped;
- var v = 0,
- u = 0,
- sum = 0,
- yStart1 = 0,
- yStart2 = 0,
- xStart1 = 0,
- xStart2 = 0,
- offset = 0;
+var _canvasContainer = {
+ ctx: {
+ image: null,
+ overlay: null
+ },
+ dom: {
+ image: null,
+ overlay: null
+ }
+};
- for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) {
- offset = offset + size | 0;
- for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) {
- yStart1 = offset - size | 0;
- yStart2 = offset + size | 0;
- xStart1 = u - 1 | 0;
- xStart2 = u + 1 | 0;
- sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0;
- if ((sum | 0) > (0 | 0)) {
- images[outImagePtr + offset + u | 0] = 1;
- } else {
- images[outImagePtr + offset + u | 0] = 0;
- }
- }
- }
- return;
- }
+var _inputImageWrapper;
- function memcpy(srcImagePtr, dstImagePtr) {
- srcImagePtr = srcImagePtr | 0;
- dstImagePtr = dstImagePtr | 0;
+var _locator;
- var length = 0;
+var _boxSize;
- length = imul(size, size) | 0;
+var _decoder;
- while ((length | 0) > 0) {
- length = length - 1 | 0;
- images[dstImagePtr + length | 0] = images[srcImagePtr + length | 0] | 0;
- }
- }
+var _workerPool = new Array();
- function zeroBorder(imagePtr) {
- imagePtr = imagePtr | 0;
+var _onUIThread;
- var x = 0,
- y = 0;
+var _resultCollector;
- for (x = 0; (x | 0) < (size - 1 | 0); x = x + 1 | 0) {
- images[imagePtr + x | 0] = 0;
- images[imagePtr + y | 0] = 0;
- y = y + size - 1 | 0;
- images[imagePtr + y | 0] = 0;
- y = y + 1 | 0;
- }
- for (x = 0; (x | 0) < (size | 0); x = x + 1 | 0) {
- images[imagePtr + y | 0] = 0;
- y = y + 1 | 0;
- }
- }
+var _config;
- function skeletonize() {
- var subImagePtr = 0,
- erodedImagePtr = 0,
- tempImagePtr = 0,
- skelImagePtr = 0,
- sum = 0,
- done = 0;
+/* harmony default export */ __webpack_exports__["default"] = ({
+ init: function init(config, cb, imageWrapper) {
+ _onUIThread = true;
+ _config = Object(_common_merge__WEBPACK_IMPORTED_MODULE_4__["merge"])(_config_config__WEBPACK_IMPORTED_MODULE_5__["config"], config);
- erodedImagePtr = imul(size, size) | 0;
- tempImagePtr = erodedImagePtr + erodedImagePtr | 0;
- skelImagePtr = tempImagePtr + erodedImagePtr | 0;
+ if (imageWrapper) {
+ _onUIThread = false;
- // init skel-image
- init(skelImagePtr, 0);
- zeroBorder(subImagePtr);
+ _initializeData(imageWrapper);
- do {
- erode(subImagePtr, erodedImagePtr);
- dilate(erodedImagePtr, tempImagePtr);
- subtract(subImagePtr, tempImagePtr, tempImagePtr);
- bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);
- memcpy(erodedImagePtr, subImagePtr);
- sum = countNonZero(subImagePtr) | 0;
- done = (sum | 0) == 0 | 0;
- } while (!done);
+ cb();
+ } else {
+ _initInputStream(cb);
}
- return {
- skeletonize: skeletonize
- };
-}
-/* @preserve ASM END */
-/* harmony default export */ __webpack_exports__["a"] = Skeletonizer;
-/* eslint-enable eqeqeq*/
+ },
+ CameraAccess: _input_camera_access__WEBPACK_IMPORTED_MODULE_7__["CameraAccess"],
+ ImageDebug: _common_image_debug__WEBPACK_IMPORTED_MODULE_2__["ImageDebug"],
+ ImageWrapper: _common_image_wrapper__WEBPACK_IMPORTED_MODULE_3__["ImageWrapper"],
+ ResultCollector: _analytics_result_collector__WEBPACK_IMPORTED_MODULE_0__["ResultCollector"],
-/***/ }),
-/* 67 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ get canvas() {
+ return _canvasContainer;
+ },
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__barcode_reader__ = __webpack_require__(1);
+ start: function start() {
+ if (_onUIThread && _config.inputStream.type === 'LiveStream') {
+ _startContinuousUpdate();
+ } else {
+ _update();
+ }
+ },
+ stop: function stop() {
+ _stopped = true;
+ _adjustWorkerPool(0);
-function TwoOfFiveReader(opts) {
- __WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].call(this, opts);
- this.barSpaceRatio = [1, 1];
-}
+ if (_config.inputStream.type === 'LiveStream') {
+ _input_camera_access__WEBPACK_IMPORTED_MODULE_7__["CameraAccess"].release();
-var N = 1,
- W = 3,
- properties = {
- START_PATTERN: { value: [W, N, W, N, N, N] },
- STOP_PATTERN: { value: [W, N, N, N, W] },
- CODE_PATTERN: { value: [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]] },
- SINGLE_CODE_ERROR: { value: 0.78, writable: true },
- AVG_CODE_ERROR: { value: 0.30, writable: true },
- FORMAT: { value: "2of5" }
-};
+ _inputStream.clearEventHandlers();
+ }
+ },
+ decodeSingle: function decodeSingle(config, resultCallback) {
+ var _this = this;
-var startPatternLength = properties.START_PATTERN.value.reduce(function (sum, val) {
- return sum + val;
-}, 0);
+ config = Object(_common_merge__WEBPACK_IMPORTED_MODULE_4__["merge"])({
+ inputStream: {
+ type: 'ImageStream',
+ sequence: false,
+ size: 800,
+ src: config.src
+ },
+ numOfWorkers: true && config.debug ? 0 : 1,
+ locator: {
+ halfSample: false
+ }
+ }, config);
+ this.init(config, function () {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].once('processed', function (result) {
+ _this.stop();
-TwoOfFiveReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype, properties);
-TwoOfFiveReader.prototype.constructor = TwoOfFiveReader;
+ resultCallback.call(null, result);
+ }, true);
-TwoOfFiveReader.prototype._findPattern = function (pattern, offset, isWhite, tryHarder) {
- var counter = [],
- self = this,
- i,
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0,
- end: 0
- },
- error,
- j,
- sum,
- epsilon = self.AVG_CODE_ERROR;
-
- isWhite = isWhite || false;
- tryHarder = tryHarder || false;
-
- if (!offset) {
- offset = self._nextSet(self._row);
+ _this.start();
+ });
+ },
+ pause: function pause() {
+ _stopped = true;
+ },
+ onDetected: function onDetected(callback) {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].subscribe('detected', callback);
+ },
+ offDetected: function offDetected(callback) {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].unsubscribe('detected', callback);
+ },
+ onProcessed: function onProcessed(callback) {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].subscribe('processed', callback);
+ },
+ offProcessed: function offProcessed(callback) {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].unsubscribe('processed', callback);
+ },
+ setReaders: function setReaders(readers) {
+ if (_decoder) {
+ _decoder.setReaders(readers);
+ } else if (_onUIThread && _workerPool.length > 0) {
+ _workerPool.forEach(function (_ref) {
+ var worker = _ref.worker;
+ return worker.postMessage({
+ cmd: 'setReaders',
+ readers: readers
+ });
+ });
}
-
- for (i = 0; i < pattern.length; i++) {
- counter[i] = 0;
+ },
+ registerResultCollector: function registerResultCollector(resultCollector) {
+ if (resultCollector && typeof resultCollector.addResult === 'function') {
+ _resultCollector = resultCollector;
}
+ }
+});
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- sum = 0;
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- error = self._matchPattern(counter, pattern);
- if (error < epsilon) {
- bestMatch.error = error;
- bestMatch.start = i - sum;
- bestMatch.end = i;
- return bestMatch;
- }
- if (tryHarder) {
- for (j = 0; j < counter.length - 2; j++) {
- counter[j] = counter[j + 2];
- }
- counter[counter.length - 2] = 0;
- counter[counter.length - 1] = 0;
- counterPos--;
- } else {
- return null;
- }
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
-
-TwoOfFiveReader.prototype._findStart = function () {
- var self = this,
- leadingWhitespaceStart,
- offset = self._nextSet(self._row),
- startInfo,
- narrowBarWidth = 1;
-
- while (!startInfo) {
- startInfo = self._findPattern(self.START_PATTERN, offset, false, true);
- if (!startInfo) {
- return null;
- }
- narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / startPatternLength);
- leadingWhitespaceStart = startInfo.start - narrowBarWidth * 5;
- if (leadingWhitespaceStart >= 0) {
- if (self._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
- return startInfo;
- }
- }
- offset = startInfo.end;
- startInfo = null;
- }
-};
+function _initializeData(imageWrapper) {
+ _initBuffers(imageWrapper);
-TwoOfFiveReader.prototype._verifyTrailingWhitespace = function (endInfo) {
- var self = this,
- trailingWhitespaceEnd;
+ _decoder = new _decoder_barcode_decoder__WEBPACK_IMPORTED_MODULE_6__["BarcodeDecoder"](_config.decoder, _inputImageWrapper);
+}
- trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
- if (trailingWhitespaceEnd < self._row.length) {
- if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
- return endInfo;
- }
- }
- return null;
-};
+function _initInputStream(callback) {
+ var video;
-TwoOfFiveReader.prototype._findEnd = function () {
- var self = this,
- endInfo,
- tmp,
- offset;
+ if (_config.inputStream.type === 'VideoStream') {
+ video = document.createElement('video');
+ _inputStream = new _input_video_stream__WEBPACK_IMPORTED_MODULE_11__["VideoStream"](video);
+ } else if (_config.inputStream.type === 'ImageStream') {
+ _inputStream = new _input_image_stream__WEBPACK_IMPORTED_MODULE_9__["ImageStream"]();
+ } else if (_config.inputStream.type === 'LiveStream') {
+ var viewport = _getViewPort();
- self._row.reverse();
- offset = self._nextSet(self._row);
- endInfo = self._findPattern(self.STOP_PATTERN, offset, false, true);
- self._row.reverse();
+ if (viewport) {
+ video = viewport.querySelector('video');
- if (endInfo === null) {
- return null;
+ if (!video) {
+ video = document.createElement('video');
+ viewport.appendChild(video);
+ }
}
- // reverse numbers
- tmp = endInfo.start;
- endInfo.start = self._row.length - endInfo.end;
- endInfo.end = self._row.length - tmp;
+ _inputStream = new _input_live_stream__WEBPACK_IMPORTED_MODULE_10__["LiveStream"](video);
+ _input_camera_access__WEBPACK_IMPORTED_MODULE_7__["CameraAccess"].request(video, _config.inputStream.constraints).then(function () {
+ return _inputStream.trigger('canrecord');
+ }, function (err) {
+ return callback(err);
+ });
+ }
- return endInfo !== null ? self._verifyTrailingWhitespace(endInfo) : null;
-};
+ _inputStream.setAttribute('preload', 'auto');
-TwoOfFiveReader.prototype._decodeCode = function (counter) {
- var j,
- self = this,
- sum = 0,
- normalized,
- error,
- epsilon = self.AVG_CODE_ERROR,
- code,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0,
- end: 0
- };
+ _inputStream.config = _config.inputStream;
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- for (code = 0; code < self.CODE_PATTERN.length; code++) {
- error = self._matchPattern(counter, self.CODE_PATTERN[code]);
- if (error < bestMatch.error) {
- bestMatch.code = code;
- bestMatch.error = error;
- }
- }
- if (bestMatch.error < epsilon) {
- return bestMatch;
- }
-};
+ _inputStream.addEventListener('canrecord', _canRecord.bind(this, callback));
+}
-TwoOfFiveReader.prototype._decodePayload = function (counters, result, decodedCodes) {
- var i,
- self = this,
- pos = 0,
- counterLength = counters.length,
- counter = [0, 0, 0, 0, 0],
- code;
+function _getViewPort() {
+ var target = _config.inputStream.target; // Check if target is already a DOM element
- while (pos < counterLength) {
- for (i = 0; i < 5; i++) {
- counter[i] = counters[pos] * this.barSpaceRatio[0];
- pos += 2;
- }
- code = self._decodeCode(counter);
- if (!code) {
- return null;
- }
- result.push(code.code + "");
- decodedCodes.push(code);
- }
- return code;
-};
+ if (target instanceof HTMLElement) {
+ return target;
+ } else {
+ // Use '#interactive.viewport' as a fallback selector (backwards compatibility)
+ var selector = typeof target === 'string' ? target : '#interactive.viewport';
+ return document.querySelector(selector);
+ }
+}
-TwoOfFiveReader.prototype._verifyCounterLength = function (counters) {
- return counters.length % 10 === 0;
-};
+function _canRecord(cb) {
+ Object(_input_input_stream_utils__WEBPACK_IMPORTED_MODULE_12__["checkImageConstraints"])(_inputStream, _config.locator);
-TwoOfFiveReader.prototype._decode = function () {
- var startInfo,
- endInfo,
- self = this,
- code,
- result = [],
- decodedCodes = [],
- counters;
-
- startInfo = self._findStart();
- if (!startInfo) {
- return null;
- }
- decodedCodes.push(startInfo);
+ _initCanvas();
- endInfo = self._findEnd();
- if (!endInfo) {
- return null;
- }
+ _frameGrabber = new _input_frame_grabber__WEBPACK_IMPORTED_MODULE_8__["FrameGrabber"](_inputStream, _canvasContainer.dom.image);
- counters = self._fillCounters(startInfo.end, endInfo.start, false);
- if (!self._verifyCounterLength(counters)) {
- return null;
+ _adjustWorkerPool(_config.numOfWorkers, function () {
+ if (_config.numOfWorkers === 0) {
+ _initializeData();
}
- code = self._decodePayload(counters, result, decodedCodes);
- if (!code) {
- return null;
- }
- if (result.length < 5) {
- return null;
- }
-
- decodedCodes.push(endInfo);
- return {
- code: result.join(""),
- start: startInfo.start,
- end: endInfo.end,
- startInfo: startInfo,
- decodedCodes: decodedCodes
- };
-};
-
-/* harmony default export */ __webpack_exports__["a"] = TwoOfFiveReader;
-
-/***/ }),
-/* 68 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__barcode_reader__ = __webpack_require__(1);
+ _inputStream.play();
-function CodabarReader() {
- __WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].call(this);
- this._counters = [];
+ cb();
+ });
}
-var properties = {
- ALPHABETH_STRING: { value: "0123456789-$:/.+ABCD" },
- ALPHABET: { value: [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 36, 58, 47, 46, 43, 65, 66, 67, 68] },
- CHARACTER_ENCODINGS: { value: [0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E] },
- START_END: { value: [0x01A, 0x029, 0x00B, 0x00E] },
- MIN_ENCODED_CHARS: { value: 4 },
- MAX_ACCEPTABLE: { value: 2.0 },
- PADDING: { value: 1.5 },
- FORMAT: { value: "codabar", writeable: false }
-};
-
-CodabarReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype, properties);
-CodabarReader.prototype.constructor = CodabarReader;
+function _initCanvas() {
+ if (typeof document !== 'undefined') {
+ var viewport = _getViewPort();
-CodabarReader.prototype._decode = function () {
- var self = this,
- result = [],
- start,
- decodedChar,
- pattern,
- nextStart,
- end;
-
- this._counters = self._fillCounters();
- start = self._findStart();
- if (!start) {
- return null;
- }
- nextStart = start.startCounter;
-
- do {
- pattern = self._toPattern(nextStart);
- if (pattern < 0) {
- return null;
- }
- decodedChar = self._patternToChar(pattern);
- if (decodedChar < 0) {
- return null;
- }
- result.push(decodedChar);
- nextStart += 8;
- if (result.length > 1 && self._isStartEnd(pattern)) {
- break;
- }
- } while (nextStart < self._counters.length);
-
- // verify end
- if (result.length - 2 < self.MIN_ENCODED_CHARS || !self._isStartEnd(pattern)) {
- return null;
- }
+ _canvasContainer.dom.image = document.querySelector('canvas.imgBuffer');
- // verify end white space
- if (!self._verifyWhitespace(start.startCounter, nextStart - 8)) {
- return null;
- }
+ if (!_canvasContainer.dom.image) {
+ _canvasContainer.dom.image = document.createElement('canvas');
+ _canvasContainer.dom.image.className = 'imgBuffer';
- if (!self._validateResult(result, start.startCounter)) {
- return null;
+ if (viewport && _config.inputStream.type === 'ImageStream') {
+ viewport.appendChild(_canvasContainer.dom.image);
+ }
}
- nextStart = nextStart > self._counters.length ? self._counters.length : nextStart;
- end = start.start + self._sumCounters(start.startCounter, nextStart - 8);
+ _canvasContainer.ctx.image = _canvasContainer.dom.image.getContext('2d');
+ _canvasContainer.dom.image.width = _inputStream.canvasWidth;
+ _canvasContainer.dom.image.height = _inputStream.canvasHeight;
+ _canvasContainer.dom.overlay = document.querySelector('canvas.drawingBuffer');
- return {
- code: result.join(""),
- start: start.start,
- end: end,
- startInfo: start,
- decodedCodes: result
- };
-};
+ if (!_canvasContainer.dom.overlay) {
+ _canvasContainer.dom.overlay = document.createElement('canvas');
+ _canvasContainer.dom.overlay.className = 'drawingBuffer';
-CodabarReader.prototype._verifyWhitespace = function (startCounter, endCounter) {
- if (startCounter - 1 <= 0 || this._counters[startCounter - 1] >= this._calculatePatternLength(startCounter) / 2.0) {
- if (endCounter + 8 >= this._counters.length || this._counters[endCounter + 7] >= this._calculatePatternLength(endCounter) / 2.0) {
- return true;
- }
- }
- return false;
-};
+ if (viewport) {
+ viewport.appendChild(_canvasContainer.dom.overlay);
+ }
-CodabarReader.prototype._calculatePatternLength = function (offset) {
- var i,
- sum = 0;
+ var clearFix = document.createElement('br');
+ clearFix.setAttribute('clear', 'all');
- for (i = offset; i < offset + 7; i++) {
- sum += this._counters[i];
+ if (viewport) {
+ viewport.appendChild(clearFix);
+ }
}
- return sum;
-};
-
-CodabarReader.prototype._thresholdResultPattern = function (result, startCounter) {
- var self = this,
- categorization = {
- space: {
- narrow: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE },
- wide: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE }
- },
- bar: {
- narrow: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE },
- wide: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE }
- }
- },
- kind,
- cat,
- i,
- j,
- pos = startCounter,
- pattern;
-
- for (i = 0; i < result.length; i++) {
- pattern = self._charToPattern(result[i]);
- for (j = 6; j >= 0; j--) {
- kind = (j & 1) === 2 ? categorization.bar : categorization.space;
- cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
- cat.size += self._counters[pos + j];
- cat.counts++;
- pattern >>= 1;
- }
- pos += 8;
- }
+ _canvasContainer.ctx.overlay = _canvasContainer.dom.overlay.getContext('2d');
+ _canvasContainer.dom.overlay.width = _inputStream.canvasWidth;
+ _canvasContainer.dom.overlay.height = _inputStream.canvasHeight;
+ }
+}
- ["space", "bar"].forEach(function (key) {
- var newkind = categorization[key];
- newkind.wide.min = Math.floor((newkind.narrow.size / newkind.narrow.counts + newkind.wide.size / newkind.wide.counts) / 2);
- newkind.narrow.max = Math.ceil(newkind.wide.min);
- newkind.wide.max = Math.ceil((newkind.wide.size * self.MAX_ACCEPTABLE + self.PADDING) / newkind.wide.counts);
+function _initBuffers(imageWrapper) {
+ if (imageWrapper) {
+ _inputImageWrapper = imageWrapper;
+ } else {
+ _inputImageWrapper = new _common_image_wrapper__WEBPACK_IMPORTED_MODULE_3__["ImageWrapper"]({
+ x: _inputStream.width,
+ y: _inputStream.height
});
+ }
- return categorization;
-};
-
-CodabarReader.prototype._charToPattern = function (char) {
- var self = this,
- charCode = char.charCodeAt(0),
- i;
-
- for (i = 0; i < self.ALPHABET.length; i++) {
- if (self.ALPHABET[i] === charCode) {
- return self.CHARACTER_ENCODINGS[i];
- }
- }
- return 0x0;
-};
-
-CodabarReader.prototype._validateResult = function (result, startCounter) {
- var self = this,
- thresholds = self._thresholdResultPattern(result, startCounter),
- i,
- j,
- kind,
- cat,
- size,
- pos = startCounter,
- pattern;
-
- for (i = 0; i < result.length; i++) {
- pattern = self._charToPattern(result[i]);
- for (j = 6; j >= 0; j--) {
- kind = (j & 1) === 0 ? thresholds.bar : thresholds.space;
- cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
- size = self._counters[pos + j];
- if (size < cat.min || size > cat.max) {
- return false;
- }
- pattern >>= 1;
- }
- pos += 8;
- }
- return true;
-};
-
-CodabarReader.prototype._patternToChar = function (pattern) {
- var i,
- self = this;
-
- for (i = 0; i < self.CHARACTER_ENCODINGS.length; i++) {
- if (self.CHARACTER_ENCODINGS[i] === pattern) {
- return String.fromCharCode(self.ALPHABET[i]);
- }
- }
- return -1;
-};
-
-CodabarReader.prototype._computeAlternatingThreshold = function (offset, end) {
- var i,
- min = Number.MAX_VALUE,
- max = 0,
- counter;
-
- for (i = offset; i < end; i += 2) {
- counter = this._counters[i];
- if (counter > max) {
- max = counter;
- }
- if (counter < min) {
- min = counter;
- }
- }
-
- return (min + max) / 2.0 | 0;
-};
-
-CodabarReader.prototype._toPattern = function (offset) {
- var numCounters = 7,
- end = offset + numCounters,
- barThreshold,
- spaceThreshold,
- bitmask = 1 << numCounters - 1,
- pattern = 0,
- i,
- threshold;
-
- if (end > this._counters.length) {
- return -1;
- }
-
- barThreshold = this._computeAlternatingThreshold(offset, end);
- spaceThreshold = this._computeAlternatingThreshold(offset + 1, end);
-
- for (i = 0; i < numCounters; i++) {
- threshold = (i & 1) === 0 ? barThreshold : spaceThreshold;
- if (this._counters[offset + i] > threshold) {
- pattern |= bitmask;
- }
- bitmask >>= 1;
- }
-
- return pattern;
-};
-
-CodabarReader.prototype._isStartEnd = function (pattern) {
- var i;
-
- for (i = 0; i < this.START_END.length; i++) {
- if (this.START_END[i] === pattern) {
- return true;
- }
- }
- return false;
-};
-
-CodabarReader.prototype._sumCounters = function (start, end) {
- var i,
- sum = 0;
-
- for (i = start; i < end; i++) {
- sum += this._counters[i];
- }
- return sum;
-};
-
-CodabarReader.prototype._findStart = function () {
- var self = this,
- i,
- pattern,
- start = self._nextUnset(self._row),
- end;
-
- for (i = 1; i < this._counters.length; i++) {
- pattern = self._toPattern(i);
- if (pattern !== -1 && self._isStartEnd(pattern)) {
- // TODO: Look for whitespace ahead
- start += self._sumCounters(0, i);
- end = start + self._sumCounters(i, i + 8);
- return {
- start: start,
- end: end,
- startCounter: i,
- endCounter: i + 8
- };
- }
- }
-};
-
-/* harmony default export */ __webpack_exports__["a"] = CodabarReader;
-
-/***/ }),
-/* 69 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__barcode_reader__ = __webpack_require__(1);
-
+ if (true) {
+ console.log(_inputImageWrapper.size);
+ }
-function Code128Reader() {
- __WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].call(this);
+ _boxSize = [{
+ x: 0,
+ y: 0
+ }, {
+ x: 0,
+ y: _inputImageWrapper.size.y
+ }, {
+ x: _inputImageWrapper.size.x,
+ y: _inputImageWrapper.size.y
+ }, {
+ x: _inputImageWrapper.size.x,
+ y: 0
+ }];
+ _locator = new _locator_barcode_locator__WEBPACK_IMPORTED_MODULE_13__["BarcodeLocator"](_inputImageWrapper, _config.locator);
+}
+
+function _transform(polygon, offset) {
+ polygon.forEach(function (vertex) {
+ vertex.x += offset.x;
+ vertex.y += offset.y;
+ });
}
-var properties = {
- CODE_SHIFT: { value: 98 },
- CODE_C: { value: 99 },
- CODE_B: { value: 100 },
- CODE_A: { value: 101 },
- START_CODE_A: { value: 103 },
- START_CODE_B: { value: 104 },
- START_CODE_C: { value: 105 },
- STOP_CODE: { value: 106 },
- CODE_PATTERN: { value: [[2, 1, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2], [2, 2, 2, 2, 2, 1], [1, 2, 1, 2, 2, 3], [1, 2, 1, 3, 2, 2], [1, 3, 1, 2, 2, 2], [1, 2, 2, 2, 1, 3], [1, 2, 2, 3, 1, 2], [1, 3, 2, 2, 1, 2], [2, 2, 1, 2, 1, 3], [2, 2, 1, 3, 1, 2], [2, 3, 1, 2, 1, 2], [1, 1, 2, 2, 3, 2], [1, 2, 2, 1, 3, 2], [1, 2, 2, 2, 3, 1], [1, 1, 3, 2, 2, 2], [1, 2, 3, 1, 2, 2], [1, 2, 3, 2, 2, 1], [2, 2, 3, 2, 1, 1], [2, 2, 1, 1, 3, 2], [2, 2, 1, 2, 3, 1], [2, 1, 3, 2, 1, 2], [2, 2, 3, 1, 1, 2], [3, 1, 2, 1, 3, 1], [3, 1, 1, 2, 2, 2], [3, 2, 1, 1, 2, 2], [3, 2, 1, 2, 2, 1], [3, 1, 2, 2, 1, 2], [3, 2, 2, 1, 1, 2], [3, 2, 2, 2, 1, 1], [2, 1, 2, 1, 2, 3], [2, 1, 2, 3, 2, 1], [2, 3, 2, 1, 2, 1], [1, 1, 1, 3, 2, 3], [1, 3, 1, 1, 2, 3], [1, 3, 1, 3, 2, 1], [1, 1, 2, 3, 1, 3], [1, 3, 2, 1, 1, 3], [1, 3, 2, 3, 1, 1], [2, 1, 1, 3, 1, 3], [2, 3, 1, 1, 1, 3], [2, 3, 1, 3, 1, 1], [1, 1, 2, 1, 3, 3], [1, 1, 2, 3, 3, 1], [1, 3, 2, 1, 3, 1], [1, 1, 3, 1, 2, 3], [1, 1, 3, 3, 2, 1], [1, 3, 3, 1, 2, 1], [3, 1, 3, 1, 2, 1], [2, 1, 1, 3, 3, 1], [2, 3, 1, 1, 3, 1], [2, 1, 3, 1, 1, 3], [2, 1, 3, 3, 1, 1], [2, 1, 3, 1, 3, 1], [3, 1, 1, 1, 2, 3], [3, 1, 1, 3, 2, 1], [3, 3, 1, 1, 2, 1], [3, 1, 2, 1, 1, 3], [3, 1, 2, 3, 1, 1], [3, 3, 2, 1, 1, 1], [3, 1, 4, 1, 1, 1], [2, 2, 1, 4, 1, 1], [4, 3, 1, 1, 1, 1], [1, 1, 1, 2, 2, 4], [1, 1, 1, 4, 2, 2], [1, 2, 1, 1, 2, 4], [1, 2, 1, 4, 2, 1], [1, 4, 1, 1, 2, 2], [1, 4, 1, 2, 2, 1], [1, 1, 2, 2, 1, 4], [1, 1, 2, 4, 1, 2], [1, 2, 2, 1, 1, 4], [1, 2, 2, 4, 1, 1], [1, 4, 2, 1, 1, 2], [1, 4, 2, 2, 1, 1], [2, 4, 1, 2, 1, 1], [2, 2, 1, 1, 1, 4], [4, 1, 3, 1, 1, 1], [2, 4, 1, 1, 1, 2], [1, 3, 4, 1, 1, 1], [1, 1, 1, 2, 4, 2], [1, 2, 1, 1, 4, 2], [1, 2, 1, 2, 4, 1], [1, 1, 4, 2, 1, 2], [1, 2, 4, 1, 1, 2], [1, 2, 4, 2, 1, 1], [4, 1, 1, 2, 1, 2], [4, 2, 1, 1, 1, 2], [4, 2, 1, 2, 1, 1], [2, 1, 2, 1, 4, 1], [2, 1, 4, 1, 2, 1], [4, 1, 2, 1, 2, 1], [1, 1, 1, 1, 4, 3], [1, 1, 1, 3, 4, 1], [1, 3, 1, 1, 4, 1], [1, 1, 4, 1, 1, 3], [1, 1, 4, 3, 1, 1], [4, 1, 1, 1, 1, 3], [4, 1, 1, 3, 1, 1], [1, 1, 3, 1, 4, 1], [1, 1, 4, 1, 3, 1], [3, 1, 1, 1, 4, 1], [4, 1, 1, 1, 3, 1], [2, 1, 1, 4, 1, 2], [2, 1, 1, 2, 1, 4], [2, 1, 1, 2, 3, 2], [2, 3, 3, 1, 1, 1, 2]] },
- SINGLE_CODE_ERROR: { value: 0.64 },
- AVG_CODE_ERROR: { value: 0.30 },
- FORMAT: { value: "code_128", writeable: false },
- MODULE_INDICES: { value: { bar: [0, 2, 4], space: [1, 3, 5] } }
-};
-
-Code128Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype, properties);
-Code128Reader.prototype.constructor = Code128Reader;
-
-Code128Reader.prototype._decodeCode = function (start, correction) {
- var counter = [0, 0, 0, 0, 0, 0],
- i,
- self = this,
- offset = start,
- isWhite = !self._row[offset],
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: start,
- end: start,
- correction: {
- bar: 1,
- space: 1
- }
- },
- code,
- error;
-
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- if (correction) {
- self._correct(counter, correction);
- }
- for (code = 0; code < self.CODE_PATTERN.length; code++) {
- error = self._matchPattern(counter, self.CODE_PATTERN[code]);
- if (error < bestMatch.error) {
- bestMatch.code = code;
- bestMatch.error = error;
- }
- }
- bestMatch.end = i;
- if (bestMatch.code === -1 || bestMatch.error > self.AVG_CODE_ERROR) {
- return null;
- }
- if (self.CODE_PATTERN[bestMatch.code]) {
- bestMatch.correction.bar = calculateCorrection(self.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar);
- bestMatch.correction.space = calculateCorrection(self.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space);
- }
- return bestMatch;
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
-
-Code128Reader.prototype._correct = function (counter, correction) {
- this._correctBars(counter, correction.bar, this.MODULE_INDICES.bar);
- this._correctBars(counter, correction.space, this.MODULE_INDICES.space);
-};
+function _transformResult(result, offset) {
+ if (result.barcodes) {
+ result.barcodes.forEach(function (barcode) {
+ return _transformResult(barcode, offset);
+ });
+ }
-Code128Reader.prototype._findStart = function () {
- var counter = [0, 0, 0, 0, 0, 0],
- i,
- self = this,
- offset = self._nextSet(self._row),
- isWhite = false,
- counterPos = 0,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0,
- end: 0,
- correction: {
- bar: 1,
- space: 1
- }
- },
- code,
- error,
- j,
- sum;
-
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- sum = 0;
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- for (code = self.START_CODE_A; code <= self.START_CODE_C; code++) {
- error = self._matchPattern(counter, self.CODE_PATTERN[code]);
- if (error < bestMatch.error) {
- bestMatch.code = code;
- bestMatch.error = error;
- }
- }
- if (bestMatch.error < self.AVG_CODE_ERROR) {
- bestMatch.start = i - sum;
- bestMatch.end = i;
- bestMatch.correction.bar = calculateCorrection(self.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar);
- bestMatch.correction.space = calculateCorrection(self.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space);
- return bestMatch;
- }
+ if (result.line) {
+ _transform(result.line, offset);
+ }
- for (j = 0; j < 4; j++) {
- counter[j] = counter[j + 2];
- }
- counter[4] = 0;
- counter[5] = 0;
- counterPos--;
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
+ if (result.box) {
+ _transform(result.box, offset);
+ }
-Code128Reader.prototype._decode = function () {
- var self = this,
- startInfo = self._findStart(),
- code = null,
- done = false,
- result = [],
- multiplier = 0,
- checksum = 0,
- codeset,
- rawResult = [],
- decodedCodes = [],
- shiftNext = false,
- unshift,
- removeLastCharacter = true;
-
- if (startInfo === null) {
- return null;
- }
- code = {
- code: startInfo.code,
- start: startInfo.start,
- end: startInfo.end,
- correction: {
- bar: startInfo.correction.bar,
- space: startInfo.correction.space
- }
- };
- decodedCodes.push(code);
- checksum = code.code;
- switch (code.code) {
- case self.START_CODE_A:
- codeset = self.CODE_A;
- break;
- case self.START_CODE_B:
- codeset = self.CODE_B;
- break;
- case self.START_CODE_C:
- codeset = self.CODE_C;
- break;
- default:
- return null;
- }
+ if (result.boxes) {
+ result.boxes.forEach(function (box) {
+ return _transform(box, offset);
+ });
+ }
+}
- while (!done) {
- unshift = shiftNext;
- shiftNext = false;
- code = self._decodeCode(code.end, code.correction);
- if (code !== null) {
- if (code.code !== self.STOP_CODE) {
- removeLastCharacter = true;
- }
+function _addResult(result, imageData, canvasWidth, canvasHeight) {
+ if (imageData && _resultCollector) {
+ if (result.barcodes) {
+ result.barcodes.forEach(function (_ref2) {
+ var codeResult = _ref2.codeResult;
- if (code.code !== self.STOP_CODE) {
- rawResult.push(code.code);
- multiplier++;
- checksum += multiplier * code.code;
- }
- decodedCodes.push(code);
-
- switch (codeset) {
- case self.CODE_A:
- if (code.code < 64) {
- result.push(String.fromCharCode(32 + code.code));
- } else if (code.code < 96) {
- result.push(String.fromCharCode(code.code - 64));
- } else {
- if (code.code !== self.STOP_CODE) {
- removeLastCharacter = false;
- }
- switch (code.code) {
- case self.CODE_SHIFT:
- shiftNext = true;
- codeset = self.CODE_B;
- break;
- case self.CODE_B:
- codeset = self.CODE_B;
- break;
- case self.CODE_C:
- codeset = self.CODE_C;
- break;
- case self.STOP_CODE:
- done = true;
- break;
- }
- }
- break;
- case self.CODE_B:
- if (code.code < 96) {
- result.push(String.fromCharCode(32 + code.code));
- } else {
- if (code.code !== self.STOP_CODE) {
- removeLastCharacter = false;
- }
- switch (code.code) {
- case self.CODE_SHIFT:
- shiftNext = true;
- codeset = self.CODE_A;
- break;
- case self.CODE_A:
- codeset = self.CODE_A;
- break;
- case self.CODE_C:
- codeset = self.CODE_C;
- break;
- case self.STOP_CODE:
- done = true;
- break;
- }
- }
- break;
- case self.CODE_C:
- if (code.code < 100) {
- result.push(code.code < 10 ? "0" + code.code : code.code);
- } else {
- if (code.code !== self.STOP_CODE) {
- removeLastCharacter = false;
- }
- switch (code.code) {
- case self.CODE_A:
- codeset = self.CODE_A;
- break;
- case self.CODE_B:
- codeset = self.CODE_B;
- break;
- case self.STOP_CODE:
- done = true;
- break;
- }
- }
- break;
- }
- } else {
- done = true;
- }
- if (unshift) {
- codeset = codeset === self.CODE_A ? self.CODE_B : self.CODE_A;
+ if (codeResult) {
+ _resultCollector.addResult(imageData, canvasWidth, canvasHeight, codeResult);
}
+ });
+ } else if (result.codeResult) {
+ _resultCollector.addResult(imageData, canvasWidth, canvasHeight, result.codeResult);
}
+ }
+}
- if (code === null) {
- return null;
- }
+function _hasCodeResult(result) {
+ return result && (!!result.codeResult || result.barcodes && result.barcodes.some(function (barcode) {
+ return !!barcode.codeResult;
+ }));
+}
- code.end = self._nextUnset(self._row, code.end);
- if (!self._verifyTrailingWhitespace(code)) {
- return null;
- }
+function _publishResult(result, imageData) {
+ var resultToPublish = result;
- checksum -= multiplier * rawResult[rawResult.length - 1];
- if (checksum % 103 !== rawResult[rawResult.length - 1]) {
- return null;
- }
-
- if (!result.length) {
- return null;
- }
+ if (result && _onUIThread) {
+ var offset = _inputStream.topLeft;
- // remove last code from result (checksum)
- if (removeLastCharacter) {
- result.splice(result.length - 1, 1);
+ if (offset.x !== 0 || offset.y !== 0) {
+ _transformResult(result, offset);
}
- return {
- code: result.join(""),
- start: startInfo.start,
- end: code.end,
- codeset: codeset,
- startInfo: startInfo,
- decodedCodes: decodedCodes,
- endInfo: code
- };
-};
-
-__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype._verifyTrailingWhitespace = function (endInfo) {
- var self = this,
- trailingWhitespaceEnd;
+ _addResult(result, imageData, _inputStream.canvasWidth, _inputStream.canvasHeight);
- trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
- if (trailingWhitespaceEnd < self._row.length) {
- if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
- return endInfo;
- }
- }
- return null;
-};
+ resultToPublish = result.barcodes || result;
+ }
-function calculateCorrection(expected, normalized, indices) {
- var length = indices.length,
- sumNormalized = 0,
- sumExpected = 0;
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].publish('processed', resultToPublish);
- while (length--) {
- sumExpected += expected[indices[length]];
- sumNormalized += normalized[indices[length]];
- }
- return sumExpected / sumNormalized;
+ if (_hasCodeResult(result)) {
+ _common_events__WEBPACK_IMPORTED_MODULE_1__["Events"].publish('detected', resultToPublish);
+ }
}
-/* harmony default export */ __webpack_exports__["a"] = Code128Reader;
-
-/***/ }),
-/* 70 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+function _locateAndDecode() {
+ var boxes = _config.locate ? _locator.locate() : [_boxSize];
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__code_39_reader__ = __webpack_require__(31);
+ var result = _decoder.decodeFromBoundingBoxes(boxes);
-
-function Code39VINReader() {
- __WEBPACK_IMPORTED_MODULE_0__code_39_reader__["a" /* default */].call(this);
+ _publishResult(result, _inputImageWrapper.data);
}
-var patterns = {
- IOQ: /[IOQ]/g,
- AZ09: /[A-Z0-9]{17}/
-};
-
-Code39VINReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__code_39_reader__["a" /* default */].prototype);
-Code39VINReader.prototype.constructor = Code39VINReader;
+function _update() {
+ if (_onUIThread) {
+ if (_workerPool.length > 0) {
+ var availableWorker = _workerPool.find(function (_ref3) {
+ var busy = _ref3.busy;
+ return !busy;
+ });
-// Cribbed from:
-// https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
-Code39VINReader.prototype._decode = function () {
- var result = __WEBPACK_IMPORTED_MODULE_0__code_39_reader__["a" /* default */].prototype._decode.apply(this);
- if (!result) {
- return null;
- }
+ if (!availableWorker) {
+ return; // all workers are busy
+ }
- var code = result.code;
+ var imageData = availableWorker.imageData;
- if (!code) {
- return null;
+ if (_frameGrabber.grab(imageData)) {
+ availableWorker.busy = true;
+ availableWorker.worker.postMessage({
+ cmd: 'process',
+ imageData: imageData
+ }, [imageData.buffer]);
+ }
+ } else if (_frameGrabber.grab(_inputImageWrapper.data)) {
+ _locateAndDecode();
}
+ } else {
+ _locateAndDecode();
+ }
+}
- code = code.replace(patterns.IOQ, '');
+function _startContinuousUpdate() {
+ var delay = 1000 / (_config.frequency || 60);
+ var next = null;
+ _stopped = false;
- if (!code.match(patterns.AZ09)) {
- if (true) {
- console.log('Failed AZ09 pattern code:', code);
- }
- return null;
- }
+ (function frame(timestamp) {
+ next = next || timestamp;
- if (!this._checkChecksum(code)) {
- return null;
- }
+ if (!_stopped) {
+ if (timestamp >= next) {
+ next += delay;
- result.code = code;
- return result;
-};
-
-Code39VINReader.prototype._checkChecksum = function (code) {
- // TODO
- return !!code;
-};
+ _update();
+ }
-/* harmony default export */ __webpack_exports__["a"] = Code39VINReader;
+ window.requestAnimationFrame(frame);
+ }
+ })(performance.now());
+}
-/***/ }),
-/* 71 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+function _initWorker(cb) {
+ var blobURL = _generateWorkerBlob();
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__barcode_reader__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__common_array_helper__ = __webpack_require__(3);
+ var workerThread = {
+ worker: new Worker(blobURL),
+ imageData: new Uint8Array(_inputStream.width * _inputStream.height),
+ busy: true
+ };
+ workerThread.worker.onmessage = function (_ref4) {
+ var data = _ref4.data;
+ if (data.event === 'initialized') {
+ URL.revokeObjectURL(blobURL);
+ workerThread.busy = false;
+ workerThread.imageData = new Uint8Array(data.imageData);
-function Code93Reader() {
- __WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].call(this);
-}
+ if (true) {
+ console.log('Worker initialized');
+ }
-var ALPHABETH_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*";
+ cb(workerThread);
+ } else if (data.event === 'processed') {
+ workerThread.busy = false;
+ workerThread.imageData = new Uint8Array(data.imageData);
-var properties = {
- ALPHABETH_STRING: { value: ALPHABETH_STRING },
- ALPHABET: { value: ALPHABETH_STRING.split('').map(function (char) {
- return char.charCodeAt(0);
- }) },
- CHARACTER_ENCODINGS: { value: [0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, 0x126, 0x1DA, 0x1D6, 0x132, 0x15E] },
- ASTERISK: { value: 0x15E },
- FORMAT: { value: "code_93", writeable: false }
-};
+ _publishResult(data.result, workerThread.imageData);
+ } else if (data.event === 'error') {
+ if (true) {
+ console.log('Worker error:', data.message);
+ }
+ }
+ };
-Code93Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__barcode_reader__["a" /* default */].prototype, properties);
-Code93Reader.prototype.constructor = Code93Reader;
+ workerThread.worker.postMessage({
+ cmd: 'init',
+ size: {
+ x: _inputStream.width,
+ y: _inputStream.height
+ },
+ imageData: workerThread.imageData,
+ config: Object(_common_merge__WEBPACK_IMPORTED_MODULE_4__["merge"])(_config, {
+ inputStream: {
+ target: null
+ }
+ })
+ }, [workerThread.imageData.buffer]);
+}
-Code93Reader.prototype._decode = function () {
- var self = this,
- counters = [0, 0, 0, 0, 0, 0],
- result = [],
- start = self._findStart(),
- decodedChar,
- lastStart,
- pattern,
- nextStart;
-
- if (!start) {
- return null;
- }
- nextStart = self._nextSet(self._row, start.end);
+function _workerInterface(factory) {
+ var Quagga;
+ var worker = self;
+ var imageWrapper;
- do {
- counters = self._toCounters(nextStart, counters);
- pattern = self._toPattern(counters);
- if (pattern < 0) {
- return null;
- }
- decodedChar = self._patternToChar(pattern);
- if (decodedChar < 0) {
- return null;
- }
- result.push(decodedChar);
- lastStart = nextStart;
- nextStart += __WEBPACK_IMPORTED_MODULE_1__common_array_helper__["a" /* default */].sum(counters);
- nextStart = self._nextSet(self._row, nextStart);
- } while (decodedChar !== '*');
- result.pop();
+ if (factory) {
+ Quagga = factory()["default"];
- if (!result.length) {
- return null;
+ if (!Quagga) {
+ worker.postMessage({
+ event: 'error',
+ message: 'Quagga could not be created'
+ });
+ return;
}
+ }
- if (!self._verifyEnd(lastStart, nextStart, counters)) {
- return null;
+ self.onmessage = function (_ref5) {
+ var data = _ref5.data;
+
+ if (data.cmd === 'init') {
+ var config = data.config;
+ config.numOfWorkers = 0;
+ imageWrapper = new Quagga.ImageWrapper({
+ x: data.size.x,
+ y: data.size.y
+ }, new Uint8Array(data.imageData));
+ Quagga.init(config, function () {
+ return worker.postMessage({
+ event: 'initialized',
+ imageData: imageWrapper.data
+ }, [imageWrapper.data.buffer]);
+ }, imageWrapper);
+ Quagga.onProcessed(function (result) {
+ return worker.postMessage({
+ event: 'processed',
+ imageData: imageWrapper.data,
+ result: result
+ }, [imageWrapper.data.buffer]);
+ });
+ } else if (data.cmd === 'process') {
+ imageWrapper.data = new Uint8Array(data.imageData);
+ Quagga.start();
+ } else if (data.cmd === 'setReaders') {
+ Quagga.setReaders(data.readers);
}
+ };
+}
- if (!self._verifyChecksums(result)) {
- return null;
- }
+function _generateWorkerBlob() {
+ // @ts-ignore
+ var factorySource = __factorySource__ || '';
+ var blob = new Blob(["(".concat(_workerInterface.toString(), ")(").concat(factorySource, ");")], {
+ type: 'text/javascript'
+ });
+ return window.URL.createObjectURL(blob);
+}
- result = result.slice(0, result.length - 2);
- if ((result = self._decodeExtended(result)) === null) {
- return null;
- };
+function _adjustWorkerPool(capacity, cb) {
+ var increaseBy = capacity - _workerPool.length;
- return {
- code: result.join(""),
- start: start.start,
- end: nextStart,
- startInfo: start,
- decodedCodes: result
- };
-};
+ if (increaseBy > 0) {
+ for (var i = 0; i < increaseBy; i++) {
+ _initWorker(function (workerThread) {
+ _workerPool.push(workerThread);
-Code93Reader.prototype._verifyEnd = function (lastStart, nextStart) {
- if (lastStart === nextStart || !this._row[nextStart]) {
- return false;
+ if (_workerPool.length >= capacity && cb) {
+ cb();
+ }
+ });
}
- return true;
-};
-
-Code93Reader.prototype._patternToChar = function (pattern) {
- var i,
- self = this;
+ } else {
+ if (increaseBy < 0) {
+ _workerPool.slice(increaseBy).forEach(function (_ref6) {
+ var worker = _ref6.worker;
+ worker.terminate();
- for (i = 0; i < self.CHARACTER_ENCODINGS.length; i++) {
- if (self.CHARACTER_ENCODINGS[i] === pattern) {
- return String.fromCharCode(self.ALPHABET[i]);
+ if (true) {
+ console.log('Worker terminated!');
}
- }
- return -1;
-};
+ });
-Code93Reader.prototype._toPattern = function (counters) {
- var numCounters = counters.length;
- var pattern = 0;
- var sum = 0;
- for (var i = 0; i < numCounters; i++) {
- sum += counters[i];
+ _workerPool = _workerPool.slice(0, increaseBy);
}
- for (var _i = 0; _i < numCounters; _i++) {
- var normalized = Math.round(counters[_i] * 9 / sum);
- if (normalized < 1 || normalized > 4) {
- return -1;
- }
- if ((_i & 1) === 0) {
- for (var j = 0; j < normalized; j++) {
- pattern = pattern << 1 | 1;
- }
- } else {
- pattern <<= normalized;
- }
- }
+ return cb && cb();
+ }
+}
- return pattern;
-};
+/***/ }),
-Code93Reader.prototype._findStart = function () {
- var self = this,
- offset = self._nextSet(self._row),
- patternStart = offset,
- counter = [0, 0, 0, 0, 0, 0],
- counterPos = 0,
- isWhite = false,
- i,
- j,
- whiteSpaceMustStart;
-
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
- } else {
- if (counterPos === counter.length - 1) {
- // find start pattern
- if (self._toPattern(counter) === self.ASTERISK) {
- whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4));
- if (self._matchRange(whiteSpaceMustStart, patternStart, 0)) {
- return {
- start: patternStart,
- end: i
- };
- }
- }
+/***/ "./src/reader/2of5-reader.ts":
+/*!***********************************!*\
+ !*** ./src/reader/2of5-reader.ts ***!
+ \***********************************/
+/*! exports provided: TwoOfFiveReader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- patternStart += counter[0] + counter[1];
- for (j = 0; j < 4; j++) {
- counter[j] = counter[j + 2];
- }
- counter[4] = 0;
- counter[5] = 0;
- counterPos--;
- } else {
- counterPos++;
- }
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoOfFiveReader", function() { return TwoOfFiveReader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-Code93Reader.prototype._decodeExtended = function (charArray) {
- var length = charArray.length;
- var result = [];
- for (var i = 0; i < length; i++) {
- var char = charArray[i];
- if (char >= 'a' && char <= 'd') {
- if (i > length - 2) {
- return null;
- }
- var nextChar = charArray[++i];
- var nextCharCode = nextChar.charCodeAt(0);
- var decodedChar = void 0;
- switch (char) {
- case 'a':
- if (nextChar >= 'A' && nextChar <= 'Z') {
- decodedChar = String.fromCharCode(nextCharCode - 64);
- } else {
- return null;
- }
- break;
- case 'b':
- if (nextChar >= 'A' && nextChar <= 'E') {
- decodedChar = String.fromCharCode(nextCharCode - 38);
- } else if (nextChar >= 'F' && nextChar <= 'J') {
- decodedChar = String.fromCharCode(nextCharCode - 11);
- } else if (nextChar >= 'K' && nextChar <= 'O') {
- decodedChar = String.fromCharCode(nextCharCode + 16);
- } else if (nextChar >= 'P' && nextChar <= 'S') {
- decodedChar = String.fromCharCode(nextCharCode + 43);
- } else if (nextChar >= 'T' && nextChar <= 'Z') {
- decodedChar = String.fromCharCode(127);
- } else {
- return null;
- }
- break;
- case 'c':
- if (nextChar >= 'A' && nextChar <= 'O') {
- decodedChar = String.fromCharCode(nextCharCode - 32);
- } else if (nextChar === 'Z') {
- decodedChar = ':';
- } else {
- return null;
- }
- break;
- case 'd':
- if (nextChar >= 'A' && nextChar <= 'Z') {
- decodedChar = String.fromCharCode(nextCharCode + 32);
- } else {
- return null;
- }
- break;
- }
- result.push(decodedChar);
- } else {
- result.push(char);
- }
- }
- return result;
-};
-Code93Reader.prototype._verifyChecksums = function (charArray) {
- return this._matchCheckChar(charArray, charArray.length - 2, 20) && this._matchCheckChar(charArray, charArray.length - 1, 15);
-};
-Code93Reader.prototype._matchCheckChar = function (charArray, index, maxWeight) {
- var _this = this;
- var arrayToCheck = charArray.slice(0, index);
- var length = arrayToCheck.length;
- var weightedSums = arrayToCheck.reduce(function (sum, char, i) {
- var weight = (i * -1 + (length - 1)) % maxWeight + 1;
- var value = _this.ALPHABET.indexOf(char.charCodeAt(0));
- return sum + weight * value;
- }, 0);
- var checkChar = this.ALPHABET[weightedSums % 47];
- return checkChar === charArray[index].charCodeAt(0);
-};
-/* harmony default export */ __webpack_exports__["a"] = Code93Reader;
-/***/ }),
-/* 72 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ean_reader__ = __webpack_require__(4);
+var N = 1;
+var W = 3;
+var START_PATTERN = [W, N, W, N, N, N];
+var STOP_PATTERN = [W, N, N, N, W];
+var CODE_PATTERN = [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]];
+var startPatternLength = START_PATTERN.reduce(function (sum, val) {
+ return sum + val;
+}, 0);
+var TwoOfFiveReader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TwoOfFiveReader, _BarcodeReader);
+ function TwoOfFiveReader(config) {
+ var _this;
-function EAN2Reader() {
- __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].call(this);
-}
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TwoOfFiveReader);
-var properties = {
- FORMAT: { value: "ean_2", writeable: false }
-};
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TwoOfFiveReader).call(this, config));
-EAN2Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype, properties);
-EAN2Reader.prototype.constructor = EAN2Reader;
-
-EAN2Reader.prototype.decode = function (row, start) {
- this._row = row;
- var counters = [0, 0, 0, 0],
- codeFrequency = 0,
- i = 0,
- offset = start,
- end = this._row.length,
- code,
- result = [],
- decodedCodes = [];
-
- for (i = 0; i < 2 && offset < end; i++) {
- code = this._decodeCode(offset);
- if (!code) {
- return null;
- }
- decodedCodes.push(code);
- result.push(code.code % 10);
- if (code.code >= this.CODE_G_START) {
- codeFrequency |= 1 << 1 - i;
- }
- if (i != 1) {
- offset = this._nextSet(this._row, code.end);
- offset = this._nextUnset(this._row, offset);
- }
- }
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), "_barSpaceRatio", void 0);
+
+ _this._barSpaceRatio = [1, 1];
+ _this._format = '2of5';
+ _this._singleCodeError = 0.78;
+ _this._averageCodeError = 0.30;
+ return _this;
+ }
+
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TwoOfFiveReader, [{
+ key: "decode",
+ value: function decode() {
+ var startInfo = this._findStart();
- if (result.length != 2 || parseInt(result.join("")) % 4 !== codeFrequency) {
+ if (!startInfo) {
return null;
- }
- return {
- code: result.join(""),
- decodedCodes: decodedCodes,
- end: code.end
- };
-};
+ }
-/* harmony default export */ __webpack_exports__["a"] = EAN2Reader;
+ var endInfo = this._findEnd();
-/***/ }),
-/* 73 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ if (!endInfo) {
+ return null;
+ }
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ean_reader__ = __webpack_require__(4);
+ var counters = this._fillCounters(startInfo.end, endInfo.start, 0);
+ if (counters.length % 10 !== 0) {
+ return null;
+ }
-function EAN5Reader() {
- __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].call(this);
-}
+ var result = new Array();
+ var decodedCodes = new Array();
+ decodedCodes.push(startInfo);
-var properties = {
- FORMAT: { value: "ean_5", writeable: false }
-};
+ var code = this._decodePayload(counters, result, decodedCodes);
-var CHECK_DIGIT_ENCODINGS = [24, 20, 18, 17, 12, 6, 3, 10, 9, 5];
+ if (!code || result.length < 5) {
+ return null;
+ }
-EAN5Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype, properties);
-EAN5Reader.prototype.constructor = EAN5Reader;
+ decodedCodes.push(endInfo);
+ return {
+ code: result.join(''),
+ start: startInfo.start,
+ end: endInfo.end,
+ startInfo: startInfo,
+ decodedCodes: decodedCodes
+ };
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var offset = this._nextSet(this._row);
-EAN5Reader.prototype.decode = function (row, start) {
- this._row = row;
- var counters = [0, 0, 0, 0],
- codeFrequency = 0,
- i = 0,
- offset = start,
- end = this._row.length,
- code,
- result = [],
- decodedCodes = [];
+ var narrowBarWidth = 1;
+ var startInfo;
- for (i = 0; i < 5 && offset < end; i++) {
- code = this._decodeCode(offset);
- if (!code) {
- return null;
- }
- decodedCodes.push(code);
- result.push(code.code % 10);
- if (code.code >= this.CODE_G_START) {
- codeFrequency |= 1 << 4 - i;
+ while (!startInfo) {
+ startInfo = this._findPattern(START_PATTERN, offset, 0, true);
+
+ if (!startInfo) {
+ return null;
}
- if (i != 4) {
- offset = this._nextSet(this._row, code.end);
- offset = this._nextUnset(this._row, offset);
+
+ narrowBarWidth = (startInfo.end - startInfo.start) / startPatternLength | 0;
+ var leadingWhitespaceStart = startInfo.start - narrowBarWidth * 5;
+
+ if (leadingWhitespaceStart >= 0) {
+ if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
+ return startInfo;
+ }
}
- }
- if (result.length != 5) {
- return null;
- }
+ offset = startInfo.end;
+ startInfo = null;
+ }
- if (extensionChecksum(result) !== determineCheckDigit(codeFrequency)) {
- return null;
+ return null;
}
- return {
- code: result.join(""),
- decodedCodes: decodedCodes,
- end: code.end
- };
-};
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(endInfo) {
+ var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
-function determineCheckDigit(codeFrequency) {
- var i;
- for (i = 0; i < 10; i++) {
- if (codeFrequency === CHECK_DIGIT_ENCODINGS[i]) {
- return i;
+ if (trailingWhitespaceEnd < this._row.length) {
+ if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
+ return endInfo;
}
- }
- return null;
-}
-
-function extensionChecksum(result) {
- var length = result.length,
- sum = 0,
- i;
+ }
- for (i = length - 2; i >= 0; i -= 2) {
- sum += result[i];
- }
- sum *= 3;
- for (i = length - 1; i >= 0; i -= 2) {
- sum += result[i];
+ return null;
}
- sum *= 3;
- return sum % 10;
-}
-
-/* harmony default export */ __webpack_exports__["a"] = EAN5Reader;
+ }, {
+ key: "_findEnd",
+ value: function _findEnd() {
+ this._row.reverse();
-/***/ }),
-/* 74 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ var offset = this._nextSet(this._row);
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ean_reader__ = __webpack_require__(4);
+ var endInfo = this._findPattern(STOP_PATTERN, offset, 0, true);
+ this._row.reverse();
-function EAN8Reader(opts, supplements) {
- __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].call(this, opts, supplements);
-}
+ if (endInfo === null) {
+ return null;
+ } // reverse numbers
-var properties = {
- FORMAT: { value: "ean_8", writeable: false }
-};
-EAN8Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype, properties);
-EAN8Reader.prototype.constructor = EAN8Reader;
+ var start = endInfo.start;
+ endInfo.start = this._row.length - endInfo.end;
+ endInfo.end = this._row.length - start;
+ return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
+ }
+ }, {
+ key: "_decodeCode",
+ value: function _decodeCode(counter) {
+ var bestMatch = {
+ error: Number.MAX_VALUE,
+ code: -1,
+ start: 0,
+ end: 0
+ };
-EAN8Reader.prototype._decodePayload = function (code, result, decodedCodes) {
- var i,
- self = this;
+ for (var code = 0; code < CODE_PATTERN.length; code++) {
+ var error = this._matchPattern(counter, CODE_PATTERN[code]);
- for (i = 0; i < 4; i++) {
- code = self._decodeCode(code.end, self.CODE_G_START);
- if (!code) {
- return null;
+ if (error < bestMatch.error) {
+ bestMatch.code = code;
+ bestMatch.error = error;
}
- result.push(code.code);
- decodedCodes.push(code);
- }
+ }
- code = self._findPattern(self.MIDDLE_PATTERN, code.end, true, false);
- if (code === null) {
- return null;
+ return bestMatch.error < this.AVERAGE_CODE_ERROR ? bestMatch : null;
}
- decodedCodes.push(code);
+ }, {
+ key: "_decodePayload",
+ value: function _decodePayload(counters, result, decodedCodes) {
+ var counterLength = counters.length;
+ var counter = [0, 0, 0, 0, 0];
+ var pos = 0;
+ var code;
+
+ while (pos < counterLength) {
+ for (var i = 0; i < 5; i++) {
+ counter[i] = counters[pos] * this._barSpaceRatio[0];
+ pos += 2;
+ }
+
+ code = this._decodeCode(counter);
- for (i = 0; i < 4; i++) {
- code = self._decodeCode(code.end, self.CODE_G_START);
if (!code) {
- return null;
+ return null;
}
- decodedCodes.push(code);
+
result.push(code.code);
- }
+ decodedCodes.push(code);
+ }
- return code;
-};
+ return code;
+ }
+ }]);
-/* harmony default export */ __webpack_exports__["a"] = EAN8Reader;
+ return TwoOfFiveReader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_7__["BarcodeReader"]);
/***/ }),
-/* 75 */
+
+/***/ "./src/reader/barcode-reader.ts":
+/*!**************************************!*\
+ !*** ./src/reader/barcode-reader.ts ***!
+ \**************************************/
+/*! exports provided: BarcodeDirection, BarcodeReader */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge__ = __webpack_require__(28);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_merge__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__barcode_reader__ = __webpack_require__(1);
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BarcodeDirection", function() { return BarcodeDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BarcodeReader", function() { return BarcodeReader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
+
+var BarcodeDirection;
+(function (BarcodeDirection) {
+ BarcodeDirection[BarcodeDirection["Forward"] = 1] = "Forward";
+ BarcodeDirection[BarcodeDirection["Reverse"] = -1] = "Reverse";
+})(BarcodeDirection || (BarcodeDirection = {}));
-function I2of5Reader(opts) {
- opts = __WEBPACK_IMPORTED_MODULE_0_lodash_merge___default()(getDefaulConfig(), opts);
- __WEBPACK_IMPORTED_MODULE_1__barcode_reader__["a" /* default */].call(this, opts);
- this.barSpaceRatio = [1, 1];
- if (opts.normalizeBarSpaceWidth) {
- this.SINGLE_CODE_ERROR = 0.38;
- this.AVG_CODE_ERROR = 0.09;
+;
+var BarcodeReader =
+/*#__PURE__*/
+function () {
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BarcodeReader, [{
+ key: "SINGLE_CODE_ERROR",
+ get: function get() {
+ return this._singleCodeError;
}
-}
+ }, {
+ key: "AVERAGE_CODE_ERROR",
+ get: function get() {
+ return this._averageCodeError;
+ }
+ }, {
+ key: "FORMAT",
+ get: function get() {
+ return this._format;
+ }
+ }], [{
+ key: "Exception",
+ get: function get() {
+ return {
+ StartNotFoundException: 'Start-Info was not found!',
+ CodeNotFoundException: 'Code could not be found!',
+ PatternNotFoundException: 'Pattern could not be found!'
+ };
+ }
+ }]);
-function getDefaulConfig() {
- var config = {};
+ function BarcodeReader(config, supplements) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BarcodeReader);
- Object.keys(I2of5Reader.CONFIG_KEYS).forEach(function (key) {
- config[key] = I2of5Reader.CONFIG_KEYS[key].default;
- });
- return config;
-}
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_singleCodeError", void 0);
-var N = 1,
- W = 3,
- properties = {
- START_PATTERN: { value: [N, N, N, N] },
- STOP_PATTERN: { value: [N, N, W] },
- CODE_PATTERN: { value: [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]] },
- SINGLE_CODE_ERROR: { value: 0.78, writable: true },
- AVG_CODE_ERROR: { value: 0.38, writable: true },
- MAX_CORRECTION_FACTOR: { value: 5 },
- FORMAT: { value: "i2of5" }
-};
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_averageCodeError", void 0);
-I2of5Reader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_1__barcode_reader__["a" /* default */].prototype, properties);
-I2of5Reader.prototype.constructor = I2of5Reader;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_format", void 0);
-I2of5Reader.prototype._matchPattern = function (counter, code) {
- if (this.config.normalizeBarSpaceWidth) {
- var i,
- counterSum = [0, 0],
- codeSum = [0, 0],
- correction = [0, 0],
- correctionRatio = this.MAX_CORRECTION_FACTOR,
- correctionRatioInverse = 1 / correctionRatio;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "_row", void 0);
- for (i = 0; i < counter.length; i++) {
- counterSum[i % 2] += counter[i];
- codeSum[i % 2] += code[i];
- }
- correction[0] = codeSum[0] / counterSum[0];
- correction[1] = codeSum[1] / counterSum[1];
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "config", void 0);
- correction[0] = Math.max(Math.min(correction[0], correctionRatio), correctionRatioInverse);
- correction[1] = Math.max(Math.min(correction[1], correctionRatio), correctionRatioInverse);
- this.barSpaceRatio = correction;
- for (i = 0; i < counter.length; i++) {
- counter[i] *= this.barSpaceRatio[i % 2];
- }
- }
- return __WEBPACK_IMPORTED_MODULE_1__barcode_reader__["a" /* default */].prototype._matchPattern.call(this, counter, code);
-};
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "supplements", void 0);
+
+ this._format = 'unknown';
+ this._row = [];
+ this.config = config || {};
+ this.supplements = supplements;
+ }
-I2of5Reader.prototype._findPattern = function (pattern, offset, isWhite, tryHarder) {
- var counter = [],
- self = this,
- i,
- counterPos = 0,
- bestMatch = {
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BarcodeReader, [{
+ key: "_findPattern",
+ value: function _findPattern(pattern, offset, isWhite, tryHarder) {
+ var counter = new Array(pattern.length);
+ var bestMatch = {
error: Number.MAX_VALUE,
code: -1,
start: 0,
end: 0
- },
- error,
- j,
- sum,
- normalized,
- epsilon = self.AVG_CODE_ERROR;
+ };
+ var epsilon = this.AVERAGE_CODE_ERROR;
+ var counterPos = 0;
- isWhite = isWhite || false;
- tryHarder = tryHarder || false;
-
- if (!offset) {
- offset = self._nextSet(self._row);
- }
+ if (!offset) {
+ offset = this._nextSet(this._row);
+ }
- for (i = 0; i < pattern.length; i++) {
- counter[i] = 0;
- }
+ counter.fill(0);
- for (i = offset; i < self._row.length; i++) {
- if (self._row[i] ^ isWhite) {
- counter[counterPos]++;
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
} else {
- if (counterPos === counter.length - 1) {
- sum = 0;
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- error = self._matchPattern(counter, pattern);
- if (error < epsilon) {
- bestMatch.error = error;
- bestMatch.start = i - sum;
- bestMatch.end = i;
- return bestMatch;
- }
- if (tryHarder) {
- for (j = 0; j < counter.length - 2; j++) {
- counter[j] = counter[j + 2];
- }
- counter[counter.length - 2] = 0;
- counter[counter.length - 1] = 0;
- counterPos--;
- } else {
- return null;
- }
- } else {
- counterPos++;
+ if (counterPos === counter.length - 1) {
+ var error = this._matchPattern(counter, pattern);
+
+ if (error < epsilon) {
+ bestMatch.error = error;
+ bestMatch.start = i - counter.reduce(function (sum, value) {
+ return sum + value;
+ }, 0);
+ bestMatch.end = i;
+ return bestMatch;
}
- counter[counterPos] = 1;
- isWhite = !isWhite;
- }
- }
- return null;
-};
-I2of5Reader.prototype._findStart = function () {
- var self = this,
- leadingWhitespaceStart,
- offset = self._nextSet(self._row),
- startInfo,
- narrowBarWidth = 1;
+ if (tryHarder) {
+ for (var j = 0; j < counter.length - 2; j++) {
+ counter[j] = counter[j + 2];
+ }
- while (!startInfo) {
- startInfo = self._findPattern(self.START_PATTERN, offset, false, true);
- if (!startInfo) {
- return null;
- }
- narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / 4);
- leadingWhitespaceStart = startInfo.start - narrowBarWidth * 10;
- if (leadingWhitespaceStart >= 0) {
- if (self._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
- return startInfo;
+ counter[counter.length - 2] = 0;
+ counter[counter.length - 1] = 0;
+ counterPos--;
+ } else {
+ return null;
}
+ } else {
+ counterPos++;
+ }
+
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
}
- offset = startInfo.end;
- startInfo = null;
+ }
+
+ return null;
}
-};
+ }, {
+ key: "_nextUnset",
+ value: function _nextUnset(line, start) {
+ for (var i = start || 0; i < line.length; i++) {
+ if (!line[i]) {
+ return i;
+ }
+ }
-I2of5Reader.prototype._verifyTrailingWhitespace = function (endInfo) {
- var self = this,
- trailingWhitespaceEnd;
+ return line.length;
+ }
+ }, {
+ key: "_nextSet",
+ value: function _nextSet(line, start) {
+ for (var i = start || 0; i < line.length; i++) {
+ if (line[i]) {
+ return i;
+ }
+ }
- trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
- if (trailingWhitespaceEnd < self._row.length) {
- if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
- return endInfo;
+ return line.length;
+ }
+ }, {
+ key: "_matchRange",
+ value: function _matchRange(start, end, value) {
+ for (var i = start < 0 ? 0 : start; i < end; i++) {
+ if (this._row[i] !== value) {
+ return false;
}
+ }
+
+ return true;
}
- return null;
-};
+ }, {
+ key: "_matchPattern",
+ value: function _matchPattern(counter, code, maxSingleError) {
+ var error = 0;
+ var sum = 0;
+ var modulo = 0;
+ maxSingleError = maxSingleError || this.SINGLE_CODE_ERROR || 1;
-I2of5Reader.prototype._findEnd = function () {
- var self = this,
- endInfo,
- tmp;
+ for (var i = 0; i < counter.length; i++) {
+ sum += counter[i];
+ modulo += code[i];
+ }
- self._row.reverse();
- endInfo = self._findPattern(self.STOP_PATTERN);
- self._row.reverse();
+ if (sum < modulo) {
+ return Number.MAX_VALUE;
+ }
- if (endInfo === null) {
- return null;
- }
+ var barWidth = sum / modulo;
+ maxSingleError *= barWidth;
- // reverse numbers
- tmp = endInfo.start;
- endInfo.start = self._row.length - endInfo.end;
- endInfo.end = self._row.length - tmp;
+ for (var _i = 0; _i < counter.length; _i++) {
+ var count = counter[_i];
+ var scaled = code[_i] * barWidth;
+ var singleError = Math.abs(count - scaled) / scaled;
- return endInfo !== null ? self._verifyTrailingWhitespace(endInfo) : null;
-};
+ if (singleError > maxSingleError) {
+ return Number.MAX_VALUE;
+ }
-I2of5Reader.prototype._decodePair = function (counterPair) {
- var i,
- code,
- codes = [],
- self = this;
+ error += singleError;
+ }
- for (i = 0; i < counterPair.length; i++) {
- code = self._decodeCode(counterPair[i]);
- if (!code) {
- return null;
- }
- codes.push(code);
+ return error / modulo;
}
- return codes;
-};
+ }, {
+ key: "_correctBars",
+ value: function _correctBars(counter, correction, indices) {
+ var length = indices.length;
+ var tmp = 0;
-I2of5Reader.prototype._decodeCode = function (counter) {
- var j,
- self = this,
- sum = 0,
- normalized,
- error,
- epsilon = self.AVG_CODE_ERROR,
- code,
- bestMatch = {
- error: Number.MAX_VALUE,
- code: -1,
- start: 0,
- end: 0
- };
+ while (length--) {
+ tmp = counter[indices[length]] * (1 - (1 - correction) / 2);
- for (j = 0; j < counter.length; j++) {
- sum += counter[j];
- }
- for (code = 0; code < self.CODE_PATTERN.length; code++) {
- error = self._matchPattern(counter, self.CODE_PATTERN[code]);
- if (error < bestMatch.error) {
- bestMatch.code = code;
- bestMatch.error = error;
+ if (tmp > 1) {
+ counter[indices[length]] = tmp;
}
+ }
}
- if (bestMatch.error < epsilon) {
- return bestMatch;
- }
-};
+ }, {
+ key: "decodePattern",
+ value: function decodePattern(pattern) {
+ this._row = pattern;
+ var result = this.decode();
-I2of5Reader.prototype._decodePayload = function (counters, result, decodedCodes) {
- var i,
- self = this,
- pos = 0,
- counterLength = counters.length,
- counterPair = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]],
- codes;
-
- while (pos < counterLength) {
- for (i = 0; i < 5; i++) {
- counterPair[0][i] = counters[pos] * this.barSpaceRatio[0];
- counterPair[1][i] = counters[pos + 1] * this.barSpaceRatio[1];
- pos += 2;
- }
- codes = self._decodePair(counterPair);
- if (!codes) {
- return null;
- }
- for (i = 0; i < codes.length; i++) {
- result.push(codes[i].code + "");
- decodedCodes.push(codes[i]);
+ if (result === null) {
+ this._row.reverse();
+
+ result = this.decode();
+
+ if (result) {
+ result.direction = BarcodeDirection.Reverse;
+ result.start = this._row.length - result.start;
+ result.end = this._row.length - result.end;
}
- }
- return codes;
-};
+ } else {
+ result.direction = BarcodeDirection.Forward;
+ }
-I2of5Reader.prototype._verifyCounterLength = function (counters) {
- return counters.length % 10 === 0;
-};
+ if (result) {
+ result.format = this.FORMAT;
+ }
-I2of5Reader.prototype._decode = function () {
- var startInfo,
- endInfo,
- self = this,
- code,
- result = [],
- decodedCodes = [],
- counters;
-
- startInfo = self._findStart();
- if (!startInfo) {
- return null;
+ return result;
}
- decodedCodes.push(startInfo);
+ }, {
+ key: "_fillCounters",
+ value: function _fillCounters(offset, end, isWhite) {
+ var counters = new Array();
+ var counterPos = 0;
+ counters[counterPos] = 0;
- endInfo = self._findEnd();
- if (!endInfo) {
- return null;
- }
+ for (var i = offset; i < end; i++) {
+ if (this._row[i] ^ isWhite) {
+ counters[counterPos]++;
+ } else {
+ counterPos++;
+ counters[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
+ }
- counters = self._fillCounters(startInfo.end, endInfo.start, false);
- if (!self._verifyCounterLength(counters)) {
- return null;
- }
- code = self._decodePayload(counters, result, decodedCodes);
- if (!code) {
- return null;
- }
- if (result.length % 2 !== 0 || result.length < 6) {
- return null;
+ return counters;
}
+ }, {
+ key: "_toCounters",
+ value: function _toCounters(start, counters) {
+ var numCounters = counters.length;
+ var end = this._row.length;
+ var isWhite = this._row[start] ? 0 : 1;
+ var counterPos = 0;
+ counters.fill(0);
- decodedCodes.push(endInfo);
- return {
- code: result.join(""),
- start: startInfo.start,
- end: endInfo.end,
- startInfo: startInfo,
- decodedCodes: decodedCodes
- };
-};
+ for (var i = start; i < end; i++) {
+ if (this._row[i] ^ isWhite) {
+ counters[counterPos]++;
+ } else {
+ counterPos++;
+
+ if (counterPos === numCounters) {
+ break;
+ } else {
+ counters[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
+ }
+ }
-I2of5Reader.CONFIG_KEYS = {
- normalizeBarSpaceWidth: {
- 'type': 'boolean',
- 'default': false,
- 'description': 'If true, the reader tries to normalize the' + 'width-difference between bars and spaces'
+ return counters;
}
-};
+ }]);
-/* harmony default export */ __webpack_exports__["a"] = I2of5Reader;
+ return BarcodeReader;
+}();
/***/ }),
-/* 76 */
+
+/***/ "./src/reader/codabar-reader.ts":
+/*!**************************************!*\
+ !*** ./src/reader/codabar-reader.ts ***!
+ \**************************************/
+/*! exports provided: CodabarReader */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ean_reader__ = __webpack_require__(4);
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CodabarReader", function() { return CodabarReader; });
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../../node_modules/@babel/runtime/helpers/typeof.js");
+/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../node_modules/@babel/runtime/helpers/toConsumableArray.js");
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_8__);
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-function UPCEReader(opts, supplements) {
- __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].call(this, opts, supplements);
-}
-var properties = {
- CODE_FREQUENCY: { value: [[56, 52, 50, 49, 44, 38, 35, 42, 41, 37], [7, 11, 13, 14, 19, 25, 28, 21, 22, 26]] },
- STOP_PATTERN: { value: [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7] },
- FORMAT: { value: "upc_e", writeable: false }
-};
-UPCEReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype, properties);
-UPCEReader.prototype.constructor = UPCEReader;
-UPCEReader.prototype._decodePayload = function (code, result, decodedCodes) {
- var i,
- self = this,
- codeFrequency = 0x0;
- for (i = 0; i < 6; i++) {
- code = self._decodeCode(code.end);
- if (!code) {
- return null;
- }
- if (code.code >= self.CODE_G_START) {
- code.code = code.code - self.CODE_G_START;
- codeFrequency |= 1 << 5 - i;
- }
- result.push(code.code);
- decodedCodes.push(code);
- }
- if (!self._determineParity(codeFrequency, result)) {
- return null;
- }
- return code;
-};
-UPCEReader.prototype._determineParity = function (codeFrequency, result) {
- var i, nrSystem;
- for (nrSystem = 0; nrSystem < this.CODE_FREQUENCY.length; nrSystem++) {
- for (i = 0; i < this.CODE_FREQUENCY[nrSystem].length; i++) {
- if (codeFrequency === this.CODE_FREQUENCY[nrSystem][i]) {
- result.unshift(nrSystem);
- result.push(i);
- return true;
- }
- }
- }
- return false;
-};
-UPCEReader.prototype._convertToUPCA = function (result) {
- var upca = [result[0]],
- lastDigit = result[result.length - 2];
+var ALPHABETH_STRING = '0123456789-$:/.+ABCD';
- if (lastDigit <= 2) {
- upca = upca.concat(result.slice(1, 3)).concat([lastDigit, 0, 0, 0, 0]).concat(result.slice(3, 6));
- } else if (lastDigit === 3) {
- upca = upca.concat(result.slice(1, 4)).concat([0, 0, 0, 0, 0]).concat(result.slice(4, 6));
- } else if (lastDigit === 4) {
- upca = upca.concat(result.slice(1, 5)).concat([0, 0, 0, 0, 0, result[5]]);
- } else {
- upca = upca.concat(result.slice(1, 6)).concat([0, 0, 0, 0, lastDigit]);
- }
+var ALPHABET = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_8___default()(ALPHABETH_STRING).map(function (_char) {
+ return _char.charCodeAt(0);
+}); // const ALPHABET = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 36, 58, 47, 46, 43, 65, 66, 67, 68];
- upca.push(result[result.length - 1]);
- return upca;
-};
-UPCEReader.prototype._checksum = function (result) {
- return __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype._checksum.call(this, this._convertToUPCA(result));
-};
+var CHARACTER_ENCODINGS = [0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E];
+var START_END = [0x01A, 0x029, 0x00B, 0x00E];
+var MIN_ENCODED_CHARS = 4;
+var MAX_ACCEPTABLE = 2.0;
+var PADDING = 1.5;
+var CodabarReader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(CodabarReader, _BarcodeReader);
-UPCEReader.prototype._findEnd = function (offset, isWhite) {
- isWhite = true;
- return __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype._findEnd.call(this, offset, isWhite);
-};
+ function CodabarReader() {
+ var _this;
-UPCEReader.prototype._verifyTrailingWhitespace = function (endInfo) {
- var self = this,
- trailingWhitespaceEnd;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, CodabarReader);
- trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
- if (trailingWhitespaceEnd < self._row.length) {
- if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
- return endInfo;
- }
- }
-};
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(CodabarReader).call(this));
-/* harmony default export */ __webpack_exports__["a"] = UPCEReader;
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this), "_counters", void 0);
-/***/ }),
-/* 77 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
+ _this._format = 'codabar';
+ _this._counters = [];
+ return _this;
+ }
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ean_reader__ = __webpack_require__(4);
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(CodabarReader, [{
+ key: "decode",
+ value: function decode() {
+ this._counters = this._fillCounters(this._nextUnset(this._row), this._row.length, 1);
+ var start = this._findStart();
-function UPCReader(opts, supplements) {
- __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].call(this, opts, supplements);
-}
+ if (!start) {
+ return null;
+ }
-var properties = {
- FORMAT: { value: "upc_a", writeable: false }
-};
+ var result = new Array();
+ var nextStart = start.startCounter;
+ var pattern;
-UPCReader.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype, properties);
-UPCReader.prototype.constructor = UPCReader;
+ do {
+ pattern = this._toPattern(nextStart);
-UPCReader.prototype._decode = function () {
- var result = __WEBPACK_IMPORTED_MODULE_0__ean_reader__["a" /* default */].prototype._decode.call(this);
+ if (pattern < 0) {
+ return null;
+ }
- if (result && result.code && result.code.length === 13 && result.code.charAt(0) === "0") {
- result.code = result.code.substring(1);
- return result;
- }
- return null;
-};
+ var decodedChar = this._patternToChar(pattern);
-/* harmony default export */ __webpack_exports__["a"] = UPCReader;
+ if (decodedChar === null) {
+ return null;
+ }
-/***/ }),
-/* 78 */
-/***/ (function(module, exports) {
+ result.push(decodedChar);
+ nextStart += 8;
-module.exports = copy
+ if (result.length > 1 && START_END.some(function (code) {
+ return code === pattern;
+ })) {
+ break;
+ }
+ } while (nextStart < this._counters.length); // verify end
-/**
- * Copy the values from one mat2 to another
- *
- * @alias mat2.copy
- * @param {mat2} out the receiving matrix
- * @param {mat2} a the source matrix
- * @returns {mat2} out
- */
-function copy(out, a) {
- out[0] = a[0]
- out[1] = a[1]
- out[2] = a[2]
- out[3] = a[3]
- return out
-}
+ if (result.length - 2 < MIN_ENCODED_CHARS || !START_END.some(function (code) {
+ return code === pattern;
+ })) {
+ return null;
+ } // verify end white space
-/***/ }),
-/* 79 */
-/***/ (function(module, exports) {
-module.exports = create
+ if (!this._verifyWhitespace(start.startCounter, nextStart - 8)) {
+ return null;
+ }
-/**
- * Creates a new identity mat2
- *
- * @alias mat2.create
- * @returns {mat2} a new 2x2 matrix
- */
-function create() {
- var out = new Float32Array(4)
- out[0] = 1
- out[1] = 0
- out[2] = 0
- out[3] = 1
- return out
-}
+ if (!this._validateResult(result, start.startCounter)) {
+ return null;
+ }
+ nextStart = nextStart > this._counters.length ? this._counters.length : nextStart;
-/***/ }),
-/* 80 */
-/***/ (function(module, exports) {
+ var end = start.start + this._sumCounters(start.startCounter, nextStart - 8);
-module.exports = invert
+ return {
+ code: result.join(''),
+ start: start.start,
+ end: end,
+ startInfo: start,
+ decodedCodes: result
+ };
+ }
+ }, {
+ key: "_verifyWhitespace",
+ value: function _verifyWhitespace(startCounter, endCounter) {
+ if (startCounter - 1 <= 0 || this._counters[startCounter - 1] >= this._calculatePatternLength(startCounter) / 2.0) {
+ if (endCounter + 8 >= this._counters.length || this._counters[endCounter + 7] >= this._calculatePatternLength(endCounter) / 2.0) {
+ return true;
+ }
+ }
-/**
- * Inverts a mat2
- *
- * @alias mat2.invert
- * @param {mat2} out the receiving matrix
- * @param {mat2} a the source matrix
- * @returns {mat2} out
- */
-function invert(out, a) {
- var a0 = a[0]
- var a1 = a[1]
- var a2 = a[2]
- var a3 = a[3]
- var det = a0 * a3 - a2 * a1
-
- if (!det) return null
- det = 1.0 / det
-
- out[0] = a3 * det
- out[1] = -a1 * det
- out[2] = -a2 * det
- out[3] = a0 * det
-
- return out
-}
+ return false;
+ }
+ }, {
+ key: "_calculatePatternLength",
+ value: function _calculatePatternLength(offset) {
+ var sum = 0;
+ for (var i = offset; i < offset + 7; i++) {
+ sum += this._counters[i];
+ }
-/***/ }),
-/* 81 */
-/***/ (function(module, exports) {
+ return sum;
+ }
+ }, {
+ key: "_thresholdResultPattern",
+ value: function _thresholdResultPattern(result, startCounter) {
+ var categorization = {
+ space: {
+ narrow: {
+ size: 0,
+ counts: 0,
+ min: 0,
+ max: Number.MAX_VALUE
+ },
+ wide: {
+ size: 0,
+ counts: 0,
+ min: 0,
+ max: Number.MAX_VALUE
+ }
+ },
+ bar: {
+ narrow: {
+ size: 0,
+ counts: 0,
+ min: 0,
+ max: Number.MAX_VALUE
+ },
+ wide: {
+ size: 0,
+ counts: 0,
+ min: 0,
+ max: Number.MAX_VALUE
+ }
+ }
+ };
+ var pos = startCounter;
+
+ for (var i = 0; i < result.length; i++) {
+ var pattern = this._charToPattern(result[i]);
+
+ for (var j = 6; j >= 0; j--) {
+ var kind = (j & 1) === 2 ? categorization.bar : categorization.space;
+ var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
+ cat.size += this._counters[pos + j];
+ cat.counts++;
+ pattern >>= 1;
+ }
-module.exports = scale
+ pos += 8;
+ }
-/**
- * Scales a vec2 by a scalar number
- *
- * @param {vec2} out the receiving vector
- * @param {vec2} a the vector to scale
- * @param {Number} b amount to scale the vector by
- * @returns {vec2} out
- */
-function scale(out, a, b) {
- out[0] = a[0] * b
- out[1] = a[1] * b
- return out
-}
+ ['space', 'bar'].forEach(function (key) {
+ var kind = categorization[key];
+ kind.wide.min = Math.floor((kind.narrow.size / kind.narrow.counts + kind.wide.size / kind.wide.counts) / 2);
+ kind.narrow.max = Math.ceil(kind.wide.min);
+ kind.wide.max = Math.ceil((kind.wide.size * MAX_ACCEPTABLE + PADDING) / kind.wide.counts);
+ });
+ return categorization;
+ }
+ }, {
+ key: "_charToPattern",
+ value: function _charToPattern(_char2) {
+ var charCode = _char2.charCodeAt(0);
-/***/ }),
-/* 82 */
-/***/ (function(module, exports) {
+ for (var i = 0; i < ALPHABET.length; i++) {
+ if (ALPHABET[i] === charCode) {
+ return CHARACTER_ENCODINGS[i];
+ }
+ }
-module.exports = transformMat2
+ return 0x0;
+ }
+ }, {
+ key: "_validateResult",
+ value: function _validateResult(result, startCounter) {
+ var threshold = this._thresholdResultPattern(result, startCounter);
-/**
- * Transforms the vec2 with a mat2
- *
- * @param {vec2} out the receiving vector
- * @param {vec2} a the vector to transform
- * @param {mat2} m matrix to transform with
- * @returns {vec2} out
- */
-function transformMat2(out, a, m) {
- var x = a[0],
- y = a[1]
- out[0] = m[0] * x + m[2] * y
- out[1] = m[1] * x + m[3] * y
- return out
-}
+ var pos = startCounter;
-/***/ }),
-/* 83 */
-/***/ (function(module, exports) {
+ for (var i = 0; i < result.length; i++) {
+ var pattern = this._charToPattern(result[i]);
-module.exports = clone;
+ for (var j = 6; j >= 0; j--) {
+ var kind = (j & 1) === 0 ? threshold.bar : threshold.space;
+ var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow;
+ var size = this._counters[pos + j];
-/**
- * Creates a new vec3 initialized with values from an existing vector
- *
- * @param {vec3} a vector to clone
- * @returns {vec3} a new 3D vector
- */
-function clone(a) {
- var out = new Float32Array(3)
- out[0] = a[0]
- out[1] = a[1]
- out[2] = a[2]
- return out
-}
+ if (size < cat.min || size > cat.max) {
+ return false;
+ }
-/***/ }),
-/* 84 */
-/***/ (function(module, exports, __webpack_require__) {
+ pattern >>= 1;
+ }
-var hashClear = __webpack_require__(122),
- hashDelete = __webpack_require__(123),
- hashGet = __webpack_require__(124),
- hashHas = __webpack_require__(125),
- hashSet = __webpack_require__(126);
+ pos += 8;
+ }
-/**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function Hash(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
-}
+ return true;
+ }
+ }, {
+ key: "_patternToChar",
+ value: function _patternToChar(pattern) {
+ for (var i = 0; i < CHARACTER_ENCODINGS.length; i++) {
+ if (CHARACTER_ENCODINGS[i] === pattern) {
+ return String.fromCharCode(ALPHABET[i]);
+ }
+ }
-// Add methods to `Hash`.
-Hash.prototype.clear = hashClear;
-Hash.prototype['delete'] = hashDelete;
-Hash.prototype.get = hashGet;
-Hash.prototype.has = hashHas;
-Hash.prototype.set = hashSet;
+ return null;
+ }
+ }, {
+ key: "_computeAlternatingThreshold",
+ value: function _computeAlternatingThreshold(offset, end) {
+ var min = Number.MAX_VALUE;
+ var max = 0;
-module.exports = Hash;
+ for (var i = offset; i < end; i += 2) {
+ var counter = this._counters[i];
+ if (counter > max) {
+ max = counter;
+ }
-/***/ }),
-/* 85 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (counter < min) {
+ min = counter;
+ }
+ }
-var ListCache = __webpack_require__(10),
- stackClear = __webpack_require__(149),
- stackDelete = __webpack_require__(150),
- stackGet = __webpack_require__(151),
- stackHas = __webpack_require__(152),
- stackSet = __webpack_require__(153);
+ return (min + max) / 2.0 | 0;
+ }
+ }, {
+ key: "_toPattern",
+ value: function _toPattern(offset) {
+ var numCounters = 7;
+ var end = offset + numCounters;
-/**
- * Creates a stack cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function Stack(entries) {
- var data = this.__data__ = new ListCache(entries);
- this.size = data.size;
-}
+ if (end > this._counters.length) {
+ return -1;
+ }
-// Add methods to `Stack`.
-Stack.prototype.clear = stackClear;
-Stack.prototype['delete'] = stackDelete;
-Stack.prototype.get = stackGet;
-Stack.prototype.has = stackHas;
-Stack.prototype.set = stackSet;
+ var barThreshold = this._computeAlternatingThreshold(offset, end);
-module.exports = Stack;
+ var spaceThreshold = this._computeAlternatingThreshold(offset + 1, end);
+ var bitmask = 1 << numCounters - 1;
+ var pattern = 0;
-/***/ }),
-/* 86 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var i = 0; i < numCounters; i++) {
+ var threshold = (i & 1) === 0 ? barThreshold : spaceThreshold;
-var root = __webpack_require__(5);
+ if (this._counters[offset + i] > threshold) {
+ pattern |= bitmask;
+ }
-/** Built-in value references. */
-var Uint8Array = root.Uint8Array;
+ bitmask >>= 1;
+ }
-module.exports = Uint8Array;
+ return pattern;
+ }
+ }, {
+ key: "_sumCounters",
+ value: function _sumCounters(start, end) {
+ var sum = 0;
+ for (var i = start; i < end; i++) {
+ sum += this._counters[i];
+ }
-/***/ }),
-/* 87 */
-/***/ (function(module, exports) {
+ return sum;
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var _this2 = this;
-/**
- * A faster alternative to `Function#apply`, this function invokes `func`
- * with the `this` binding of `thisArg` and the arguments of `args`.
- *
- * @private
- * @param {Function} func The function to invoke.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {Array} args The arguments to invoke `func` with.
- * @returns {*} Returns the result of `func`.
- */
-function apply(func, thisArg, args) {
- switch (args.length) {
- case 0: return func.call(thisArg);
- case 1: return func.call(thisArg, args[0]);
- case 2: return func.call(thisArg, args[0], args[1]);
- case 3: return func.call(thisArg, args[0], args[1], args[2]);
- }
- return func.apply(thisArg, args);
-}
+ var start = this._nextUnset(this._row);
-module.exports = apply;
+ var _loop = function _loop(i) {
+ var pattern = _this2._toPattern(i);
+ if (pattern !== -1 && START_END.some(function (code) {
+ return code === pattern;
+ })) {
+ // TODO: Look for whitespace ahead
+ start += _this2._sumCounters(0, i);
-/***/ }),
-/* 88 */
-/***/ (function(module, exports, __webpack_require__) {
+ var end = start + _this2._sumCounters(i, i + 8);
-var baseTimes = __webpack_require__(107),
- isArguments = __webpack_require__(18),
- isArray = __webpack_require__(2),
- isBuffer = __webpack_require__(44),
- isIndex = __webpack_require__(15),
- isTypedArray = __webpack_require__(45);
+ return {
+ v: {
+ start: start,
+ end: end,
+ startCounter: i,
+ endCounter: i + 8
+ }
+ };
+ }
+ };
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ for (var i = 1; i < this._counters.length; i++) {
+ var _ret = _loop(i);
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v;
+ }
-/**
- * Creates an array of the enumerable property names of the array-like `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @param {boolean} inherited Specify returning inherited property names.
- * @returns {Array} Returns the array of property names.
- */
-function arrayLikeKeys(value, inherited) {
- var isArr = isArray(value),
- isArg = !isArr && isArguments(value),
- isBuff = !isArr && !isArg && isBuffer(value),
- isType = !isArr && !isArg && !isBuff && isTypedArray(value),
- skipIndexes = isArr || isArg || isBuff || isType,
- result = skipIndexes ? baseTimes(value.length, String) : [],
- length = result.length;
-
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) &&
- !(skipIndexes && (
- // Safari 9 has enumerable `arguments.length` in strict mode.
- key == 'length' ||
- // Node.js 0.10 has enumerable non-index properties on buffers.
- (isBuff && (key == 'offset' || key == 'parent')) ||
- // PhantomJS 2 has enumerable non-index properties on typed arrays.
- (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
- // Skip index properties.
- isIndex(key, length)
- ))) {
- result.push(key);
+ return null;
}
- }
- return result;
-}
-
-module.exports = arrayLikeKeys;
-
-
-/***/ }),
-/* 89 */
-/***/ (function(module, exports) {
-
-/**
- * A specialized version of `_.map` for arrays without support for iteratee
- * shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
-function arrayMap(array, iteratee) {
- var index = -1,
- length = array == null ? 0 : array.length,
- result = Array(length);
-
- while (++index < length) {
- result[index] = iteratee(array[index], index, array);
- }
- return result;
-}
-
-module.exports = arrayMap;
+ }]);
+ return CodabarReader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_9__["BarcodeReader"]);
/***/ }),
-/* 90 */
-/***/ (function(module, exports) {
-/**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
-function arrayPush(array, values) {
- var index = -1,
- length = values.length,
- offset = array.length;
+/***/ "./src/reader/code-128-reader.ts":
+/*!***************************************!*\
+ !*** ./src/reader/code-128-reader.ts ***!
+ \***************************************/
+/*! exports provided: Code128Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
- while (++index < length) {
- array[offset + index] = values[index];
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Code128Reader", function() { return Code128Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
+
+
+
+
+
+
+var CODE_SHIFT = 98;
+var CODE_C = 99;
+var CODE_B = 100;
+var CODE_A = 101;
+var START_CODE_A = 103;
+var START_CODE_B = 104;
+var START_CODE_C = 105;
+var STOP_CODE = 106;
+var CODE_PATTERN = [[2, 1, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2], [2, 2, 2, 2, 2, 1], [1, 2, 1, 2, 2, 3], [1, 2, 1, 3, 2, 2], [1, 3, 1, 2, 2, 2], [1, 2, 2, 2, 1, 3], [1, 2, 2, 3, 1, 2], [1, 3, 2, 2, 1, 2], [2, 2, 1, 2, 1, 3], [2, 2, 1, 3, 1, 2], [2, 3, 1, 2, 1, 2], [1, 1, 2, 2, 3, 2], [1, 2, 2, 1, 3, 2], [1, 2, 2, 2, 3, 1], [1, 1, 3, 2, 2, 2], [1, 2, 3, 1, 2, 2], [1, 2, 3, 2, 2, 1], [2, 2, 3, 2, 1, 1], [2, 2, 1, 1, 3, 2], [2, 2, 1, 2, 3, 1], [2, 1, 3, 2, 1, 2], [2, 2, 3, 1, 1, 2], [3, 1, 2, 1, 3, 1], [3, 1, 1, 2, 2, 2], [3, 2, 1, 1, 2, 2], [3, 2, 1, 2, 2, 1], [3, 1, 2, 2, 1, 2], [3, 2, 2, 1, 1, 2], [3, 2, 2, 2, 1, 1], [2, 1, 2, 1, 2, 3], [2, 1, 2, 3, 2, 1], [2, 3, 2, 1, 2, 1], [1, 1, 1, 3, 2, 3], [1, 3, 1, 1, 2, 3], [1, 3, 1, 3, 2, 1], [1, 1, 2, 3, 1, 3], [1, 3, 2, 1, 1, 3], [1, 3, 2, 3, 1, 1], [2, 1, 1, 3, 1, 3], [2, 3, 1, 1, 1, 3], [2, 3, 1, 3, 1, 1], [1, 1, 2, 1, 3, 3], [1, 1, 2, 3, 3, 1], [1, 3, 2, 1, 3, 1], [1, 1, 3, 1, 2, 3], [1, 1, 3, 3, 2, 1], [1, 3, 3, 1, 2, 1], [3, 1, 3, 1, 2, 1], [2, 1, 1, 3, 3, 1], [2, 3, 1, 1, 3, 1], [2, 1, 3, 1, 1, 3], [2, 1, 3, 3, 1, 1], [2, 1, 3, 1, 3, 1], [3, 1, 1, 1, 2, 3], [3, 1, 1, 3, 2, 1], [3, 3, 1, 1, 2, 1], [3, 1, 2, 1, 1, 3], [3, 1, 2, 3, 1, 1], [3, 3, 2, 1, 1, 1], [3, 1, 4, 1, 1, 1], [2, 2, 1, 4, 1, 1], [4, 3, 1, 1, 1, 1], [1, 1, 1, 2, 2, 4], [1, 1, 1, 4, 2, 2], [1, 2, 1, 1, 2, 4], [1, 2, 1, 4, 2, 1], [1, 4, 1, 1, 2, 2], [1, 4, 1, 2, 2, 1], [1, 1, 2, 2, 1, 4], [1, 1, 2, 4, 1, 2], [1, 2, 2, 1, 1, 4], [1, 2, 2, 4, 1, 1], [1, 4, 2, 1, 1, 2], [1, 4, 2, 2, 1, 1], [2, 4, 1, 2, 1, 1], [2, 2, 1, 1, 1, 4], [4, 1, 3, 1, 1, 1], [2, 4, 1, 1, 1, 2], [1, 3, 4, 1, 1, 1], [1, 1, 1, 2, 4, 2], [1, 2, 1, 1, 4, 2], [1, 2, 1, 2, 4, 1], [1, 1, 4, 2, 1, 2], [1, 2, 4, 1, 1, 2], [1, 2, 4, 2, 1, 1], [4, 1, 1, 2, 1, 2], [4, 2, 1, 1, 1, 2], [4, 2, 1, 2, 1, 1], [2, 1, 2, 1, 4, 1], [2, 1, 4, 1, 2, 1], [4, 1, 2, 1, 2, 1], [1, 1, 1, 1, 4, 3], [1, 1, 1, 3, 4, 1], [1, 3, 1, 1, 4, 1], [1, 1, 4, 1, 1, 3], [1, 1, 4, 3, 1, 1], [4, 1, 1, 1, 1, 3], [4, 1, 1, 3, 1, 1], [1, 1, 3, 1, 4, 1], [1, 1, 4, 1, 3, 1], [3, 1, 1, 1, 4, 1], [4, 1, 1, 1, 3, 1], [2, 1, 1, 4, 1, 2], [2, 1, 1, 2, 1, 4], [2, 1, 1, 2, 3, 2], [2, 3, 3, 1, 1, 1, 2]];
+var MODULE_INDICES = {
+ bar: [0, 2, 4],
+ space: [1, 3, 5]
+};
+var Code128Reader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Code128Reader, _BarcodeReader);
+
+ function Code128Reader() {
+ var _this;
+
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Code128Reader);
+
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Code128Reader).call(this));
+ _this._format = 'code_128';
+ _this._singleCodeError = 0.64;
+ _this._averageCodeError = 0.30;
+ return _this;
}
- return array;
-}
-
-module.exports = arrayPush;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Code128Reader, [{
+ key: "_decodeCode",
+ value: function _decodeCode(start, correction) {
+ var counter = [0, 0, 0, 0, 0, 0];
+ var offset = start;
+ var bestMatch = {
+ error: Number.MAX_VALUE,
+ code: -1,
+ start: start,
+ end: start,
+ correction: {
+ bar: 1,
+ space: 1
+ }
+ };
+ var epsilon = this.AVERAGE_CODE_ERROR;
+ var isWhite = this._row[offset] ? 0 : 1;
+ var counterPos = 0;
-/***/ }),
-/* 91 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
+ } else {
+ if (counterPos === counter.length - 1) {
+ if (correction) {
+ this._correct(counter, correction);
+ }
-var isObject = __webpack_require__(0);
+ for (var code = 0; code < CODE_PATTERN.length; code++) {
+ var error = this._matchPattern(counter, CODE_PATTERN[code]);
-/** Built-in value references. */
-var objectCreate = Object.create;
+ if (error < bestMatch.error) {
+ bestMatch.code = code;
+ bestMatch.error = error;
+ }
+ }
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} proto The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
- function object() {}
- return function(proto) {
- if (!isObject(proto)) {
- return {};
- }
- if (objectCreate) {
- return objectCreate(proto);
- }
- object.prototype = proto;
- var result = new object;
- object.prototype = undefined;
- return result;
- };
-}());
+ bestMatch.end = i;
-module.exports = baseCreate;
+ if (bestMatch.code === -1 || bestMatch.error > epsilon) {
+ return null;
+ }
+ var expected = CODE_PATTERN[bestMatch.code];
-/***/ }),
-/* 92 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (expected) {
+ bestMatch.correction.bar = this._calculateCorrection(expected, counter, MODULE_INDICES.bar);
+ bestMatch.correction.space = this._calculateCorrection(expected, counter, MODULE_INDICES.space);
+ }
-var arrayPush = __webpack_require__(90),
- isFlattenable = __webpack_require__(128);
+ return bestMatch;
+ } else {
+ counterPos++;
+ }
-/**
- * The base implementation of `_.flatten` with support for restricting flattening.
- *
- * @private
- * @param {Array} array The array to flatten.
- * @param {number} depth The maximum recursion depth.
- * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
- * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
- * @param {Array} [result=[]] The initial result value.
- * @returns {Array} Returns the new flattened array.
- */
-function baseFlatten(array, depth, predicate, isStrict, result) {
- var index = -1,
- length = array.length;
-
- predicate || (predicate = isFlattenable);
- result || (result = []);
-
- while (++index < length) {
- var value = array[index];
- if (depth > 0 && predicate(value)) {
- if (depth > 1) {
- // Recursively flatten arrays (susceptible to call stack limits).
- baseFlatten(value, depth - 1, predicate, isStrict, result);
- } else {
- arrayPush(result, value);
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
}
- } else if (!isStrict) {
- result[result.length] = value;
+
+ return null;
}
- }
- return result;
-}
+ }, {
+ key: "_correct",
+ value: function _correct(counter, correction) {
+ this._correctBars(counter, correction.bar, MODULE_INDICES.bar);
-module.exports = baseFlatten;
+ this._correctBars(counter, correction.space, MODULE_INDICES.space);
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var counter = [0, 0, 0, 0, 0, 0];
+ var offset = this._nextSet(this._row);
-/***/ }),
-/* 93 */
-/***/ (function(module, exports, __webpack_require__) {
+ var bestMatch = {
+ error: Number.MAX_VALUE,
+ code: -1,
+ start: 0,
+ end: 0,
+ correction: {
+ bar: 1,
+ space: 1
+ }
+ };
+ var epsilon = this.AVERAGE_CODE_ERROR;
+ var isWhite = 0;
+ var counterPos = 0;
+ var sum;
+
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
+ } else {
+ if (counterPos === counter.length - 1) {
+ sum = 0;
-var createBaseFor = __webpack_require__(117);
+ for (var j = 0; j < counter.length; j++) {
+ sum += counter[j];
+ }
-/**
- * The base implementation of `baseForOwn` which iterates over `object`
- * properties returned by `keysFunc` and invokes `iteratee` for each property.
- * Iteratee functions may exit iteration early by explicitly returning `false`.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
-var baseFor = createBaseFor();
+ for (var code = START_CODE_A; code <= START_CODE_C; code++) {
+ var error = this._matchPattern(counter, CODE_PATTERN[code]);
-module.exports = baseFor;
+ if (error < bestMatch.error) {
+ bestMatch.code = code;
+ bestMatch.error = error;
+ }
+ }
+ if (bestMatch.error < epsilon) {
+ bestMatch.start = i - sum;
+ bestMatch.end = i;
+ bestMatch.correction.bar = this._calculateCorrection(CODE_PATTERN[bestMatch.code], counter, MODULE_INDICES.bar);
+ bestMatch.correction.space = this._calculateCorrection(CODE_PATTERN[bestMatch.code], counter, MODULE_INDICES.space);
+ return bestMatch;
+ }
-/***/ }),
-/* 94 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var _j = 0; _j < 4; _j++) {
+ counter[_j] = counter[_j + 2];
+ }
-var castPath = __webpack_require__(13),
- toKey = __webpack_require__(23);
+ counter[4] = 0;
+ counter[5] = 0;
+ counterPos--;
+ } else {
+ counterPos++;
+ }
-/**
- * The base implementation of `_.get` without support for default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @returns {*} Returns the resolved value.
- */
-function baseGet(object, path) {
- path = castPath(path, object);
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
+ }
- var index = 0,
- length = path.length;
+ return null;
+ }
+ }, {
+ key: "decode",
+ value: function decode() {
+ var result = new Array();
- while (object != null && index < length) {
- object = object[toKey(path[index++])];
- }
- return (index && index == length) ? object : undefined;
-}
+ var startInfo = this._findStart();
-module.exports = baseGet;
+ var code = null;
+ var done = false;
+ var multiplier = 0;
+ var checksum = 0;
+ var codeset;
+ var rawResult = new Array();
+ var decodedCodes = new Array();
+ var shiftNext = false;
+ var unshift;
+ var removeLastCharacter = true;
+ if (startInfo === null) {
+ return null;
+ }
-/***/ }),
-/* 95 */
-/***/ (function(module, exports) {
+ code = {
+ code: startInfo.code,
+ start: startInfo.start,
+ end: startInfo.end,
+ correction: {
+ bar: startInfo.correction.bar,
+ space: startInfo.correction.space
+ }
+ };
+ decodedCodes.push(code);
+ checksum = code.code;
-/**
- * The base implementation of `_.hasIn` without support for deep paths.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {Array|string} key The key to check.
- * @returns {boolean} Returns `true` if `key` exists, else `false`.
- */
-function baseHasIn(object, key) {
- return object != null && key in Object(object);
-}
+ switch (code.code) {
+ case START_CODE_A:
+ codeset = CODE_A;
+ break;
-module.exports = baseHasIn;
+ case START_CODE_B:
+ codeset = CODE_B;
+ break;
+ case START_CODE_C:
+ codeset = CODE_C;
+ break;
-/***/ }),
-/* 96 */
-/***/ (function(module, exports, __webpack_require__) {
+ default:
+ return null;
+ }
-var baseGetTag = __webpack_require__(8),
- isObjectLike = __webpack_require__(6);
+ while (!done) {
+ unshift = shiftNext;
+ shiftNext = false;
+ code = this._decodeCode(code.end, code.correction);
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]';
+ if (code !== null) {
+ if (code.code !== STOP_CODE) {
+ removeLastCharacter = true;
+ }
+
+ if (code.code !== STOP_CODE) {
+ rawResult.push(code.code);
+ multiplier++;
+ checksum += multiplier * code.code;
+ }
+
+ decodedCodes.push(code);
+
+ switch (codeset) {
+ case CODE_A:
+ {
+ if (code.code < 64) {
+ result.push(String.fromCharCode(32 + code.code));
+ } else if (code.code < 96) {
+ result.push(String.fromCharCode(code.code - 64));
+ } else {
+ if (code.code !== STOP_CODE) {
+ removeLastCharacter = false;
+ }
+
+ switch (code.code) {
+ case CODE_SHIFT:
+ shiftNext = true;
+ codeset = CODE_B;
+ break;
+
+ case CODE_B:
+ codeset = CODE_B;
+ break;
+
+ case CODE_C:
+ codeset = CODE_C;
+ break;
+
+ case STOP_CODE:
+ done = true;
+ break;
+ }
+ }
-/**
- * The base implementation of `_.isArguments`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- */
-function baseIsArguments(value) {
- return isObjectLike(value) && baseGetTag(value) == argsTag;
-}
+ break;
+ }
-module.exports = baseIsArguments;
+ case CODE_B:
+ {
+ if (code.code < 96) {
+ result.push(String.fromCharCode(32 + code.code));
+ } else {
+ if (code.code !== STOP_CODE) {
+ removeLastCharacter = false;
+ }
+
+ switch (code.code) {
+ case CODE_SHIFT:
+ shiftNext = true;
+ codeset = CODE_A;
+ break;
+
+ case CODE_A:
+ codeset = CODE_A;
+ break;
+
+ case CODE_C:
+ codeset = CODE_C;
+ break;
+
+ case STOP_CODE:
+ done = true;
+ break;
+ }
+ }
+ break;
+ }
-/***/ }),
-/* 97 */
-/***/ (function(module, exports, __webpack_require__) {
+ case CODE_C:
+ {
+ if (code.code < 100) {
+ result.push(code.code < 10 ? '0' + code.code : code.code);
+ } else {
+ if (code.code !== STOP_CODE) {
+ removeLastCharacter = false;
+ }
+
+ switch (code.code) {
+ case CODE_A:
+ codeset = CODE_A;
+ break;
+
+ case CODE_B:
+ codeset = CODE_B;
+ break;
+
+ case STOP_CODE:
+ done = true;
+ break;
+ }
+ }
-var isFunction = __webpack_require__(25),
- isMasked = __webpack_require__(132),
- isObject = __webpack_require__(0),
- toSource = __webpack_require__(155);
+ break;
+ }
+ }
+ } else {
+ done = true;
+ }
-/**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
-var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+ if (unshift) {
+ codeset = codeset === CODE_A ? CODE_B : CODE_A;
+ }
+ }
-/** Used to detect host constructors (Safari). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
+ if (code === null) {
+ return null;
+ }
-/** Used for built-in method references. */
-var funcProto = Function.prototype,
- objectProto = Object.prototype;
+ code.end = this._nextUnset(this._row, code.end);
-/** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
+ if (!this._verifyTrailingWhitespace(code)) {
+ return null;
+ }
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ checksum -= multiplier * rawResult[rawResult.length - 1];
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
- funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
+ if (checksum % 103 !== rawResult[rawResult.length - 1]) {
+ return null;
+ }
-/**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- * else `false`.
- */
-function baseIsNative(value) {
- if (!isObject(value) || isMasked(value)) {
- return false;
- }
- var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
- return pattern.test(toSource(value));
-}
+ if (!result.length) {
+ return null;
+ } // remove last code from result (checksum)
-module.exports = baseIsNative;
+ if (removeLastCharacter) {
+ result.splice(result.length - 1, 1);
+ }
-/***/ }),
-/* 98 */
-/***/ (function(module, exports, __webpack_require__) {
+ return {
+ code: result.join(''),
+ start: startInfo.start,
+ end: code.end,
+ codeset: codeset,
+ startInfo: startInfo,
+ decodedCodes: decodedCodes,
+ endInfo: code
+ };
+ }
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(endInfo) {
+ var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
-var baseGetTag = __webpack_require__(8),
- isLength = __webpack_require__(26),
- isObjectLike = __webpack_require__(6);
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
- arrayTag = '[object Array]',
- boolTag = '[object Boolean]',
- dateTag = '[object Date]',
- errorTag = '[object Error]',
- funcTag = '[object Function]',
- mapTag = '[object Map]',
- numberTag = '[object Number]',
- objectTag = '[object Object]',
- regexpTag = '[object RegExp]',
- setTag = '[object Set]',
- stringTag = '[object String]',
- weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
- dataViewTag = '[object DataView]',
- float32Tag = '[object Float32Array]',
- float64Tag = '[object Float64Array]',
- int8Tag = '[object Int8Array]',
- int16Tag = '[object Int16Array]',
- int32Tag = '[object Int32Array]',
- uint8Tag = '[object Uint8Array]',
- uint8ClampedTag = '[object Uint8ClampedArray]',
- uint16Tag = '[object Uint16Array]',
- uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values of typed arrays. */
-var typedArrayTags = {};
-typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-typedArrayTags[uint32Tag] = true;
-typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
-typedArrayTags[errorTag] = typedArrayTags[funcTag] =
-typedArrayTags[mapTag] = typedArrayTags[numberTag] =
-typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
-typedArrayTags[setTag] = typedArrayTags[stringTag] =
-typedArrayTags[weakMapTag] = false;
+ if (trailingWhitespaceEnd < this._row.length) {
+ if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
+ return endInfo;
+ }
+ }
-/**
- * The base implementation of `_.isTypedArray` without Node.js optimizations.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- */
-function baseIsTypedArray(value) {
- return isObjectLike(value) &&
- isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
-}
+ return null;
+ }
+ }, {
+ key: "_calculateCorrection",
+ value: function _calculateCorrection(expected, normalized, indices) {
+ var sumNormalized = 0;
+ var sumExpected = 0;
+
+ for (var length = indices.length; length--;) {
+ sumExpected += expected[indices[length]];
+ sumNormalized += normalized[indices[length]];
+ }
-module.exports = baseIsTypedArray;
+ return sumExpected / sumNormalized;
+ }
+ }]);
+ return Code128Reader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_5__["BarcodeReader"]);
/***/ }),
-/* 99 */
-/***/ (function(module, exports, __webpack_require__) {
-var isObject = __webpack_require__(0),
- isPrototype = __webpack_require__(40),
- nativeKeysIn = __webpack_require__(144);
+/***/ "./src/reader/code-39-reader.ts":
+/*!**************************************!*\
+ !*** ./src/reader/code-39-reader.ts ***!
+ \**************************************/
+/*! exports provided: Code39Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Code39Reader", function() { return Code39Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../node_modules/@babel/runtime/helpers/toConsumableArray.js");
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-/**
- * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function baseKeysIn(object) {
- if (!isObject(object)) {
- return nativeKeysIn(object);
- }
- var isProto = isPrototype(object),
- result = [];
- for (var key in object) {
- if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
- result.push(key);
- }
- }
- return result;
-}
-module.exports = baseKeysIn;
-/***/ }),
-/* 100 */
-/***/ (function(module, exports, __webpack_require__) {
-var Stack = __webpack_require__(85),
- assignMergeValue = __webpack_require__(35),
- baseFor = __webpack_require__(93),
- baseMergeDeep = __webpack_require__(101),
- isObject = __webpack_require__(0),
- keysIn = __webpack_require__(46);
+var ASTERISK = 0x094;
+var ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%';
+var ALPHABET = new Uint16Array(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5___default()(ALPHABETH_STRING).map(function (_char) {
+ return _char.charCodeAt(0);
+})); // const ALPHABET = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+// 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 45, 46, 32, 42, 36, 47, 43, 37];
-/**
- * The base implementation of `_.merge` without support for multiple sources.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {number} srcIndex The index of `source`.
- * @param {Function} [customizer] The function to customize merged values.
- * @param {Object} [stack] Tracks traversed source values and their merged
- * counterparts.
- */
-function baseMerge(object, source, srcIndex, customizer, stack) {
- if (object === source) {
- return;
+var CHARACTER_ENCODINGS = new Uint16Array([0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A]);
+var Code39Reader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Code39Reader, _BarcodeReader);
+
+ function Code39Reader() {
+ var _this;
+
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Code39Reader);
+
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Code39Reader).call(this));
+ _this._format = 'code_39';
+ return _this;
}
- baseFor(source, function(srcValue, key) {
- if (isObject(srcValue)) {
- stack || (stack = new Stack);
- baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
- }
- else {
- var newValue = customizer
- ? customizer(object[key], srcValue, (key + ''), object, source, stack)
- : undefined;
- if (newValue === undefined) {
- newValue = srcValue;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Code39Reader, [{
+ key: "decode",
+ value: function decode() {
+ var start = this._findStart();
+
+ if (!start) {
+ return null;
}
- assignMergeValue(object, key, newValue);
- }
- }, keysIn);
-}
-module.exports = baseMerge;
+ var result = new Array();
+ var counters = new Uint16Array(9);
+ var decodedChar;
+ var lastStart;
+ var nextStart = this._nextSet(this._row, start.end);
-/***/ }),
-/* 101 */
-/***/ (function(module, exports, __webpack_require__) {
+ do {
+ this._toCounters(nextStart, counters);
-var assignMergeValue = __webpack_require__(35),
- cloneBuffer = __webpack_require__(111),
- cloneTypedArray = __webpack_require__(112),
- copyArray = __webpack_require__(113),
- initCloneObject = __webpack_require__(127),
- isArguments = __webpack_require__(18),
- isArray = __webpack_require__(2),
- isArrayLikeObject = __webpack_require__(159),
- isBuffer = __webpack_require__(44),
- isFunction = __webpack_require__(25),
- isObject = __webpack_require__(0),
- isPlainObject = __webpack_require__(160),
- isTypedArray = __webpack_require__(45),
- toPlainObject = __webpack_require__(164);
+ var pattern = this._toPattern(counters);
-/**
- * A specialized version of `baseMerge` for arrays and objects which performs
- * deep merges and tracks traversed objects enabling objects with circular
- * references to be merged.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {string} key The key of the value to merge.
- * @param {number} srcIndex The index of `source`.
- * @param {Function} mergeFunc The function to merge values.
- * @param {Function} [customizer] The function to customize assigned values.
- * @param {Object} [stack] Tracks traversed source values and their merged
- * counterparts.
- */
-function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
- var objValue = object[key],
- srcValue = source[key],
- stacked = stack.get(srcValue);
+ if (pattern < 0) {
+ return null;
+ }
- if (stacked) {
- assignMergeValue(object, key, stacked);
- return;
- }
- var newValue = customizer
- ? customizer(objValue, srcValue, (key + ''), object, source, stack)
- : undefined;
+ decodedChar = this._patternToChar(pattern);
- var isCommon = newValue === undefined;
+ if (decodedChar === null) {
+ return null;
+ }
- if (isCommon) {
- var isArr = isArray(srcValue),
- isBuff = !isArr && isBuffer(srcValue),
- isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+ result.push(decodedChar);
+ lastStart = nextStart;
+ nextStart += counters.reduce(function (sum, item) {
+ return sum + item;
+ }, 0);
+ nextStart = this._nextSet(this._row, nextStart);
+ } while (decodedChar !== '*');
- newValue = srcValue;
- if (isArr || isBuff || isTyped) {
- if (isArray(objValue)) {
- newValue = objValue;
- }
- else if (isArrayLikeObject(objValue)) {
- newValue = copyArray(objValue);
- }
- else if (isBuff) {
- isCommon = false;
- newValue = cloneBuffer(srcValue, true);
- }
- else if (isTyped) {
- isCommon = false;
- newValue = cloneTypedArray(srcValue, true);
+ result.pop();
+
+ if (!result.length) {
+ return null;
}
- else {
- newValue = [];
+
+ if (!this._verifyTrailingWhitespace(lastStart, nextStart, counters)) {
+ return null;
}
+
+ return {
+ code: result.join(''),
+ start: start.start,
+ end: nextStart,
+ startInfo: start,
+ decodedCodes: result
+ };
}
- else if (isPlainObject(srcValue) || isArguments(srcValue)) {
- newValue = objValue;
- if (isArguments(objValue)) {
- newValue = toPlainObject(objValue);
- }
- else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
- newValue = initCloneObject(srcValue);
+ }, {
+ key: "_patternToChar",
+ value: function _patternToChar(pattern) {
+ for (var i = 0; i < CHARACTER_ENCODINGS.length; i++) {
+ if (CHARACTER_ENCODINGS[i] === pattern) {
+ return String.fromCharCode(ALPHABET[i]);
+ }
}
+
+ return null;
}
- else {
- isCommon = false;
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(lastStart, nextStart, counters) {
+ var patternSize = counters.reduce(function (sum, item) {
+ return sum + item;
+ }, 0);
+ var trailingWhitespaceEnd = nextStart - lastStart - patternSize;
+ return trailingWhitespaceEnd * 3 >= patternSize;
}
- }
- if (isCommon) {
- // Recursively merge objects and arrays (susceptible to call stack limits).
- stack.set(srcValue, newValue);
- mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
- stack['delete'](srcValue);
- }
- assignMergeValue(object, key, newValue);
-}
-
-module.exports = baseMergeDeep;
-
-
-/***/ }),
-/* 102 */
-/***/ (function(module, exports, __webpack_require__) {
+ }, {
+ key: "_findNextWidth",
+ value: function _findNextWidth(counters, current) {
+ var minWidth = Number.MAX_VALUE;
-var basePickBy = __webpack_require__(103),
- hasIn = __webpack_require__(158);
-
-/**
- * The base implementation of `_.pick` without support for individual
- * property identifiers.
- *
- * @private
- * @param {Object} object The source object.
- * @param {string[]} paths The property paths to pick.
- * @returns {Object} Returns the new object.
- */
-function basePick(object, paths) {
- return basePickBy(object, paths, function(value, path) {
- return hasIn(object, path);
- });
-}
+ for (var i = 0; i < counters.length; i++) {
+ if (counters[i] < minWidth && counters[i] > current) {
+ minWidth = counters[i];
+ }
+ }
-module.exports = basePick;
+ return minWidth;
+ }
+ }, {
+ key: "_toPattern",
+ value: function _toPattern(counters) {
+ var numCounters = counters.length;
+ var maxNarrowWidth = 0;
+ var numWideBars = numCounters;
+ var wideBarWidth = 0;
+ var pattern;
+ while (numWideBars > 3) {
+ maxNarrowWidth = this._findNextWidth(counters, maxNarrowWidth);
+ numWideBars = 0;
+ pattern = 0;
-/***/ }),
-/* 103 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var i = 0; i < numCounters; i++) {
+ if (counters[i] > maxNarrowWidth) {
+ pattern |= 1 << numCounters - 1 - i;
+ numWideBars++;
+ wideBarWidth += counters[i];
+ }
+ }
-var baseGet = __webpack_require__(94),
- baseSet = __webpack_require__(105),
- castPath = __webpack_require__(13);
+ if (numWideBars === 3) {
+ for (var _i = 0; _i < numCounters && numWideBars > 0; _i++) {
+ if (counters[_i] > maxNarrowWidth) {
+ numWideBars--;
-/**
- * The base implementation of `_.pickBy` without support for iteratee shorthands.
- *
- * @private
- * @param {Object} object The source object.
- * @param {string[]} paths The property paths to pick.
- * @param {Function} predicate The function invoked per property.
- * @returns {Object} Returns the new object.
- */
-function basePickBy(object, paths, predicate) {
- var index = -1,
- length = paths.length,
- result = {};
+ if (counters[_i] * 2 >= wideBarWidth) {
+ return -1;
+ }
+ }
+ }
- while (++index < length) {
- var path = paths[index],
- value = baseGet(object, path);
+ return pattern;
+ }
+ }
- if (predicate(value, path)) {
- baseSet(result, castPath(path, object), value);
+ return -1;
}
- }
- return result;
-}
-
-module.exports = basePickBy;
-
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var offset = this._nextSet(this._row);
-/***/ }),
-/* 104 */
-/***/ (function(module, exports, __webpack_require__) {
+ var patternStart = offset;
+ var counter = new Uint16Array(9);
+ var counterPos = 0;
+ var isWhite = 0;
+ var whiteSpaceMustStart;
-var identity = __webpack_require__(43),
- overRest = __webpack_require__(41),
- setToString = __webpack_require__(42);
-
-/**
- * The base implementation of `_.rest` which doesn't validate or coerce arguments.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- */
-function baseRest(func, start) {
- return setToString(overRest(func, start, identity), func + '');
-}
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
+ } else {
+ if (counterPos === counter.length - 1) {
+ // find start pattern
+ if (this._toPattern(counter) === ASTERISK) {
+ whiteSpaceMustStart = Math.max(0, patternStart - (i - patternStart) / 4) | 0;
-module.exports = baseRest;
+ if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) {
+ return {
+ start: patternStart,
+ end: i
+ };
+ }
+ }
+ patternStart += counter[0] + counter[1];
-/***/ }),
-/* 105 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var j = 0; j < 7; j++) {
+ counter[j] = counter[j + 2];
+ }
-var assignValue = __webpack_require__(36),
- castPath = __webpack_require__(13),
- isIndex = __webpack_require__(15),
- isObject = __webpack_require__(0),
- toKey = __webpack_require__(23);
+ counter[7] = 0;
+ counter[8] = 0;
+ counterPos--;
+ } else {
+ counterPos++;
+ }
-/**
- * The base implementation of `_.set`.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {Array|string} path The path of the property to set.
- * @param {*} value The value to set.
- * @param {Function} [customizer] The function to customize path creation.
- * @returns {Object} Returns `object`.
- */
-function baseSet(object, path, value, customizer) {
- if (!isObject(object)) {
- return object;
- }
- path = castPath(path, object);
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
+ }
- var index = -1,
- length = path.length,
- lastIndex = length - 1,
- nested = object;
+ return null;
+ }
+ }]);
- while (nested != null && ++index < length) {
- var key = toKey(path[index]),
- newValue = value;
+ return Code39Reader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_6__["BarcodeReader"]);
- if (index != lastIndex) {
- var objValue = nested[key];
- newValue = customizer ? customizer(objValue, key, nested) : undefined;
- if (newValue === undefined) {
- newValue = isObject(objValue)
- ? objValue
- : (isIndex(path[index + 1]) ? [] : {});
- }
- }
- assignValue(nested, key, newValue);
- nested = nested[key];
- }
- return object;
-}
+/***/ }),
-module.exports = baseSet;
+/***/ "./src/reader/code-39-vin-reader.ts":
+/*!******************************************!*\
+ !*** ./src/reader/code-39-vin-reader.ts ***!
+ \******************************************/
+/*! exports provided: Code39VINReader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Code39VINReader", function() { return Code39VINReader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "../../node_modules/@babel/runtime/helpers/get.js");
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _code_39_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./code-39-reader */ "./src/reader/code-39-reader.ts");
-/***/ }),
-/* 106 */
-/***/ (function(module, exports, __webpack_require__) {
-var constant = __webpack_require__(156),
- defineProperty = __webpack_require__(37),
- identity = __webpack_require__(43);
-/**
- * The base implementation of `setToString` without support for hot loop shorting.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
- */
-var baseSetToString = !defineProperty ? identity : function(func, string) {
- return defineProperty(func, 'toString', {
- 'configurable': true,
- 'enumerable': false,
- 'value': constant(string),
- 'writable': true
- });
-};
-module.exports = baseSetToString;
-/***/ }),
-/* 107 */
-/***/ (function(module, exports) {
-/**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
-function baseTimes(n, iteratee) {
- var index = -1,
- result = Array(n);
+var Code39VINReader =
+/*#__PURE__*/
+function (_Code39Reader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(Code39VINReader, _Code39Reader);
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
-}
+ function Code39VINReader() {
+ var _this;
-module.exports = baseTimes;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Code39VINReader);
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Code39VINReader).call(this));
+ _this._format = 'code_39_vin';
+ return _this;
+ }
+ /**
+ * @borrows
+ * https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
+ */
-/***/ }),
-/* 108 */
-/***/ (function(module, exports, __webpack_require__) {
-var Symbol = __webpack_require__(11),
- arrayMap = __webpack_require__(89),
- isArray = __webpack_require__(2),
- isSymbol = __webpack_require__(27);
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Code39VINReader, [{
+ key: "decode",
+ value: function decode() {
+ var result = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Code39VINReader.prototype), "decode", this).call(this);
-/** Used as references for various `Number` constants. */
-var INFINITY = 1 / 0;
+ if (!result) {
+ return null;
+ }
-/** Used to convert symbols to primitives and strings. */
-var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
+ var code = result.code;
-/**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
-function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isArray(value)) {
- // Recursively convert values (susceptible to call stack limits).
- return arrayMap(value, baseToString) + '';
- }
- if (isSymbol(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
-}
+ if (!code) {
+ return null;
+ }
-module.exports = baseToString;
+ code = code.replace(/[IOQ]/g, '');
+ if (!/[A-Z0-9]{17}/.test(code)) {
+ if (true) {
+ console.log('Failed AZ09 pattern code:', code);
+ }
-/***/ }),
-/* 109 */
-/***/ (function(module, exports) {
+ return null;
+ }
-/**
- * The base implementation of `_.unary` without support for storing metadata.
- *
- * @private
- * @param {Function} func The function to cap arguments for.
- * @returns {Function} Returns the new capped function.
- */
-function baseUnary(func) {
- return function(value) {
- return func(value);
- };
-}
+ if (!this._checkChecksum(code)) {
+ return null;
+ }
-module.exports = baseUnary;
+ result.code = code;
+ return result;
+ }
+ }, {
+ key: "_checkChecksum",
+ value: function _checkChecksum(code) {
+ // TODO
+ return !!code;
+ }
+ }]);
+ return Code39VINReader;
+}(_code_39_reader__WEBPACK_IMPORTED_MODULE_6__["Code39Reader"]);
/***/ }),
-/* 110 */
-/***/ (function(module, exports, __webpack_require__) {
-var Uint8Array = __webpack_require__(86);
-
-/**
- * Creates a clone of `arrayBuffer`.
- *
- * @private
- * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
- * @returns {ArrayBuffer} Returns the cloned array buffer.
- */
-function cloneArrayBuffer(arrayBuffer) {
- var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
- new Uint8Array(result).set(new Uint8Array(arrayBuffer));
- return result;
-}
+/***/ "./src/reader/code-93-reader.ts":
+/*!**************************************!*\
+ !*** ./src/reader/code-93-reader.ts ***!
+ \**************************************/
+/*! exports provided: Code93Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-module.exports = cloneArrayBuffer;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Code93Reader", function() { return Code93Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../node_modules/@babel/runtime/helpers/toConsumableArray.js");
+/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-/***/ }),
-/* 111 */
-/***/ (function(module, exports, __webpack_require__) {
-/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(5);
-/** Detect free variable `exports`. */
-var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
-/** Detect free variable `module`. */
-var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
-/** Detect the popular CommonJS extension `module.exports`. */
-var moduleExports = freeModule && freeModule.exports === freeExports;
-/** Built-in value references. */
-var Buffer = moduleExports ? root.Buffer : undefined,
- allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;
+var ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*';
+var ALPHABET = new Uint16Array(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_5___default()(ALPHABETH_STRING).map(function (_char) {
+ return _char.charCodeAt(0);
+}));
+var CHARACTER_ENCODINGS = new Uint16Array([0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, 0x126, 0x1DA, 0x1D6, 0x132, 0x15E]);
+var ASTERISK = 0x15E;
+var Code93Reader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Code93Reader, _BarcodeReader);
-/**
- * Creates a clone of `buffer`.
- *
- * @private
- * @param {Buffer} buffer The buffer to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Buffer} Returns the cloned buffer.
- */
-function cloneBuffer(buffer, isDeep) {
- if (isDeep) {
- return buffer.slice();
- }
- var length = buffer.length,
- result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+ function Code93Reader() {
+ var _this;
- buffer.copy(result);
- return result;
-}
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Code93Reader);
-module.exports = cloneBuffer;
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Code93Reader).call(this));
+ _this._format = 'code_93';
+ return _this;
+ }
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(29)(module)))
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Code93Reader, [{
+ key: "decode",
+ value: function decode() {
+ var start = this._findStart();
-/***/ }),
-/* 112 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!start) {
+ return null;
+ }
-var cloneArrayBuffer = __webpack_require__(110);
+ var result = new Array();
+ var counters = new Uint16Array(6);
+ var decodedChar;
+ var lastStart;
-/**
- * Creates a clone of `typedArray`.
- *
- * @private
- * @param {Object} typedArray The typed array to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned typed array.
- */
-function cloneTypedArray(typedArray, isDeep) {
- var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
- return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
-}
+ var nextStart = this._nextSet(this._row, start.end);
-module.exports = cloneTypedArray;
+ do {
+ this._toCounters(nextStart, counters);
+ var pattern = this._toPattern(counters);
-/***/ }),
-/* 113 */
-/***/ (function(module, exports) {
+ if (pattern < 0) {
+ return null;
+ }
-/**
- * Copies the values of `source` to `array`.
- *
- * @private
- * @param {Array} source The array to copy values from.
- * @param {Array} [array=[]] The array to copy values to.
- * @returns {Array} Returns `array`.
- */
-function copyArray(source, array) {
- var index = -1,
- length = source.length;
+ decodedChar = this._patternToChar(pattern);
- array || (array = Array(length));
- while (++index < length) {
- array[index] = source[index];
- }
- return array;
-}
+ if (decodedChar === null) {
+ return null;
+ }
-module.exports = copyArray;
+ result.push(decodedChar);
+ lastStart = nextStart;
+ nextStart += counters.reduce(function (sum, item) {
+ return sum + item;
+ }, 0);
+ nextStart = this._nextSet(this._row, nextStart);
+ } while (decodedChar !== '*');
+ result.pop();
-/***/ }),
-/* 114 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!result.length) {
+ return null;
+ }
-var assignValue = __webpack_require__(36),
- baseAssignValue = __webpack_require__(21);
+ if (!this._verifyEnd(lastStart, nextStart)) {
+ return null;
+ }
-/**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property identifiers to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @param {Function} [customizer] The function to customize copied values.
- * @returns {Object} Returns `object`.
- */
-function copyObject(source, props, object, customizer) {
- var isNew = !object;
- object || (object = {});
+ if (!this._verifyChecksums(result)) {
+ return null;
+ }
- var index = -1,
- length = props.length;
+ result = result.slice(0, result.length - 2);
- while (++index < length) {
- var key = props[index];
+ if ((result = this._decodeExtended(result)) === null) {
+ return null;
+ }
- var newValue = customizer
- ? customizer(object[key], source[key], key, object, source)
- : undefined;
+ return {
+ code: result.join(''),
+ start: start.start,
+ end: nextStart,
+ startInfo: start,
+ decodedCodes: result
+ };
+ }
+ }, {
+ key: "_patternToChar",
+ value: function _patternToChar(pattern) {
+ for (var i = 0; i < CHARACTER_ENCODINGS.length; i++) {
+ if (CHARACTER_ENCODINGS[i] === pattern) {
+ return String.fromCharCode(ALPHABET[i]);
+ }
+ }
- if (newValue === undefined) {
- newValue = source[key];
+ return null;
}
- if (isNew) {
- baseAssignValue(object, key, newValue);
- } else {
- assignValue(object, key, newValue);
+ }, {
+ key: "_verifyEnd",
+ value: function _verifyEnd(lastStart, nextStart) {
+ if (lastStart === nextStart || !this._row[nextStart]) {
+ return false;
+ }
+
+ return true;
}
- }
- return object;
-}
+ }, {
+ key: "_toPattern",
+ value: function _toPattern(counters) {
+ var numCounters = counters.length;
+ var pattern = 0;
+ var sum = 0;
-module.exports = copyObject;
+ for (var i = 0; i < numCounters; i++) {
+ sum += counters[i];
+ }
+ for (var _i = 0; _i < numCounters; _i++) {
+ var normalized = Math.round(counters[_i] * 9 / sum);
-/***/ }),
-/* 115 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (normalized < 1 || normalized > 4) {
+ return -1;
+ }
-var root = __webpack_require__(5);
+ if ((_i & 1) === 0) {
+ for (var j = 0; j < normalized; j++) {
+ pattern = pattern << 1 | 1;
+ }
+ } else {
+ pattern <<= normalized;
+ }
+ }
-/** Used to detect overreaching core-js shims. */
-var coreJsData = root['__core-js_shared__'];
+ return pattern;
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var counter = new Uint16Array(6);
-module.exports = coreJsData;
+ var offset = this._nextSet(this._row);
+ var patternStart = offset;
+ var counterPos = 0;
+ var isWhite = 0;
+ var whiteSpaceMustStart;
-/***/ }),
-/* 116 */
-/***/ (function(module, exports, __webpack_require__) {
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
+ } else {
+ if (counterPos === counter.length - 1) {
+ // find start pattern
+ if (this._toPattern(counter) === ASTERISK) {
+ whiteSpaceMustStart = Math.max(0, patternStart - (i - patternStart) / 4) | 0;
-var baseRest = __webpack_require__(104),
- isIterateeCall = __webpack_require__(129);
+ if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) {
+ return {
+ start: patternStart,
+ end: i
+ };
+ }
+ }
-/**
- * Creates a function like `_.assign`.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @returns {Function} Returns the new assigner function.
- */
-function createAssigner(assigner) {
- return baseRest(function(object, sources) {
- var index = -1,
- length = sources.length,
- customizer = length > 1 ? sources[length - 1] : undefined,
- guard = length > 2 ? sources[2] : undefined;
+ patternStart += counter[0] + counter[1];
- customizer = (assigner.length > 3 && typeof customizer == 'function')
- ? (length--, customizer)
- : undefined;
+ for (var j = 0; j < 4; j++) {
+ counter[j] = counter[j + 2];
+ }
- if (guard && isIterateeCall(sources[0], sources[1], guard)) {
- customizer = length < 3 ? undefined : customizer;
- length = 1;
- }
- object = Object(object);
- while (++index < length) {
- var source = sources[index];
- if (source) {
- assigner(object, source, index, customizer);
+ counter[4] = 0;
+ counter[5] = 0;
+ counterPos--;
+ } else {
+ counterPos++;
+ }
+
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
}
+
+ return null;
}
- return object;
- });
-}
+ }, {
+ key: "_decodeExtended",
+ value: function _decodeExtended(charArray) {
+ var length = charArray.length;
+ var result = new Array();
-module.exports = createAssigner;
+ for (var i = 0; i < length; i++) {
+ var _char2 = charArray[i];
+ if (_char2 >= 'a' && _char2 <= 'd') {
+ if (i > length - 2) {
+ return null;
+ }
-/***/ }),
-/* 117 */
-/***/ (function(module, exports) {
+ var nextChar = charArray[++i];
+ var nextCharCode = nextChar.charCodeAt(0);
+ var decodedChar = void 0;
-/**
- * Creates a base function for methods like `_.forIn` and `_.forOwn`.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseFor(fromRight) {
- return function(object, iteratee, keysFunc) {
- var index = -1,
- iterable = Object(object),
- props = keysFunc(object),
- length = props.length;
+ switch (_char2) {
+ case 'a':
+ {
+ if (nextChar >= 'A' && nextChar <= 'Z') {
+ decodedChar = String.fromCharCode(nextCharCode - 64);
+ } else {
+ return null;
+ }
- while (length--) {
- var key = props[fromRight ? length : ++index];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
- }
- }
- return object;
- };
-}
+ break;
+ }
+
+ case 'b':
+ {
+ if (nextChar >= 'A' && nextChar <= 'E') {
+ decodedChar = String.fromCharCode(nextCharCode - 38);
+ } else if (nextChar >= 'F' && nextChar <= 'J') {
+ decodedChar = String.fromCharCode(nextCharCode - 11);
+ } else if (nextChar >= 'K' && nextChar <= 'O') {
+ decodedChar = String.fromCharCode(nextCharCode + 16);
+ } else if (nextChar >= 'P' && nextChar <= 'S') {
+ decodedChar = String.fromCharCode(nextCharCode + 43);
+ } else if (nextChar >= 'T' && nextChar <= 'Z') {
+ decodedChar = String.fromCharCode(127);
+ } else {
+ return null;
+ }
-module.exports = createBaseFor;
+ break;
+ }
+
+ case 'c':
+ {
+ if (nextChar >= 'A' && nextChar <= 'O') {
+ decodedChar = String.fromCharCode(nextCharCode - 32);
+ } else if (nextChar === 'Z') {
+ decodedChar = ':';
+ } else {
+ return null;
+ }
+ break;
+ }
-/***/ }),
-/* 118 */
-/***/ (function(module, exports, __webpack_require__) {
+ case 'd':
+ {
+ if (nextChar >= 'A' && nextChar <= 'Z') {
+ decodedChar = String.fromCharCode(nextCharCode + 32);
+ } else {
+ return null;
+ }
-var flatten = __webpack_require__(157),
- overRest = __webpack_require__(41),
- setToString = __webpack_require__(42);
+ break;
+ }
+ }
-/**
- * A specialized version of `baseRest` which flattens the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @returns {Function} Returns the new function.
- */
-function flatRest(func) {
- return setToString(overRest(func, undefined, flatten), func + '');
-}
+ result.push(decodedChar);
+ } else {
+ result.push(_char2);
+ }
+ }
-module.exports = flatRest;
+ return result;
+ }
+ }, {
+ key: "_verifyChecksums",
+ value: function _verifyChecksums(charArray) {
+ return this._matchCheckChar(charArray, charArray.length - 2, 20) && this._matchCheckChar(charArray, charArray.length - 1, 15);
+ }
+ }, {
+ key: "_matchCheckChar",
+ value: function _matchCheckChar(charArray, index, maxWeight) {
+ var arrayToCheck = charArray.slice(0, index);
+ var length = arrayToCheck.length;
+ var weightedSums = arrayToCheck.reduce(function (sum, _char3, i) {
+ var weight = (i * -1 + (length - 1)) % maxWeight + 1;
+ var value = ALPHABET.indexOf(_char3.charCodeAt(0));
+ return sum + weight * value;
+ }, 0);
+ var checkChar = ALPHABET[weightedSums % 47];
+ return checkChar === charArray[index].charCodeAt(0);
+ }
+ }]);
+ return Code93Reader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_6__["BarcodeReader"]);
/***/ }),
-/* 119 */
-/***/ (function(module, exports, __webpack_require__) {
-var Symbol = __webpack_require__(11);
+/***/ "./src/reader/ean-2-reader.ts":
+/*!************************************!*\
+ !*** ./src/reader/ean-2-reader.ts ***!
+ \************************************/
+/*! exports provided: EAN2Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EAN2Reader", function() { return EAN2Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var nativeObjectToString = objectProto.toString;
-/** Built-in value references. */
-var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
-/**
- * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the raw `toStringTag`.
- */
-function getRawTag(value) {
- var isOwn = hasOwnProperty.call(value, symToStringTag),
- tag = value[symToStringTag];
- try {
- value[symToStringTag] = undefined;
- var unmasked = true;
- } catch (e) {}
-
- var result = nativeObjectToString.call(value);
- if (unmasked) {
- if (isOwn) {
- value[symToStringTag] = tag;
- } else {
- delete value[symToStringTag];
- }
- }
- return result;
-}
-module.exports = getRawTag;
+var EAN2Reader =
+/*#__PURE__*/
+function (_EANReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EAN2Reader, _EANReader);
+ function EAN2Reader(config, supplements) {
+ var _this;
-/***/ }),
-/* 120 */
-/***/ (function(module, exports) {
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EAN2Reader);
-/**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
-function getValue(object, key) {
- return object == null ? undefined : object[key];
-}
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EAN2Reader).call(this, config, supplements));
+ _this._format = 'ean_2';
+ return _this;
+ }
-module.exports = getValue;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EAN2Reader, [{
+ key: "decode",
+ value: function decode(row, start) {
+ var end = row.length;
+ var result = new Array();
+ var decodedCodes = new Array();
+ var offset = start;
+ var codeFrequency = 0;
+ var code;
+ this._row = row;
+
+ for (var i = 0; i < 2 && offset < end; i++) {
+ code = this._decodeCode(offset);
+ if (!code) {
+ return null;
+ }
-/***/ }),
-/* 121 */
-/***/ (function(module, exports, __webpack_require__) {
+ decodedCodes.push(code);
+ result.push(code.code % 10);
-var castPath = __webpack_require__(13),
- isArguments = __webpack_require__(18),
- isArray = __webpack_require__(2),
- isIndex = __webpack_require__(15),
- isLength = __webpack_require__(26),
- toKey = __webpack_require__(23);
+ if (code.code >= this.CODE_G_START) {
+ codeFrequency |= 1 << 1 - i;
+ }
-/**
- * Checks if `path` exists on `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @param {Function} hasFunc The function to check properties.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- */
-function hasPath(object, path, hasFunc) {
- path = castPath(path, object);
+ if (i !== 1) {
+ offset = this._nextSet(this._row, code.end);
+ offset = this._nextUnset(this._row, offset);
+ }
+ }
- var index = -1,
- length = path.length,
- result = false;
+ if (result.length !== 2 || parseInt(result.join('')) % 4 !== codeFrequency) {
+ return null;
+ }
- while (++index < length) {
- var key = toKey(path[index]);
- if (!(result = object != null && hasFunc(object, key))) {
- break;
+ return {
+ code: result.join(''),
+ decodedCodes: decodedCodes,
+ end: code.end
+ };
}
- object = object[key];
- }
- if (result || ++index != length) {
- return result;
- }
- length = object == null ? 0 : object.length;
- return !!length && isLength(length) && isIndex(key, length) &&
- (isArray(object) || isArguments(object));
-}
-
-module.exports = hasPath;
+ }]);
+ return EAN2Reader;
+}(_ean_reader__WEBPACK_IMPORTED_MODULE_5__["EANReader"]);
/***/ }),
-/* 122 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var nativeCreate = __webpack_require__(16);
-
-/**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
-function hashClear() {
- this.__data__ = nativeCreate ? nativeCreate(null) : {};
- this.size = 0;
-}
-module.exports = hashClear;
+/***/ "./src/reader/ean-5-reader.ts":
+/*!************************************!*\
+ !*** ./src/reader/ean-5-reader.ts ***!
+ \************************************/
+/*! exports provided: EAN5Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EAN5Reader", function() { return EAN5Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
-/***/ }),
-/* 123 */
-/***/ (function(module, exports) {
-/**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function hashDelete(key) {
- var result = this.has(key) && delete this.__data__[key];
- this.size -= result ? 1 : 0;
- return result;
-}
-module.exports = hashDelete;
-/***/ }),
-/* 124 */
-/***/ (function(module, exports, __webpack_require__) {
-var nativeCreate = __webpack_require__(16);
+var EAN5Reader =
+/*#__PURE__*/
+function (_EANReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EAN5Reader, _EANReader);
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(EAN5Reader, [{
+ key: "CHECK_DIGIT_ENCODINGS",
+ get: function get() {
+ return [24, 20, 18, 17, 12, 6, 3, 10, 9, 5];
+ }
+ }]);
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ function EAN5Reader(config, supplements) {
+ var _this;
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EAN5Reader);
-/**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function hashGet(key) {
- var data = this.__data__;
- if (nativeCreate) {
- var result = data[key];
- return result === HASH_UNDEFINED ? undefined : result;
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(EAN5Reader).call(this, config, supplements));
+ _this._format = 'ean_5';
+ return _this;
}
- return hasOwnProperty.call(data, key) ? data[key] : undefined;
-}
-
-module.exports = hashGet;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(EAN5Reader, [{
+ key: "decode",
+ value: function decode(row, start) {
+ var end = row.length;
+ var result = new Array();
+ var decodedCodes = new Array();
+ var codeFrequency = 0;
+ var offset = start;
+ var code;
+ this._row = row;
+
+ for (var i = 0; i < 5 && offset < end; i++) {
+ code = this._decodeCode(offset);
-/***/ }),
-/* 125 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!code) {
+ return null;
+ }
-var nativeCreate = __webpack_require__(16);
+ decodedCodes.push(code);
+ result.push(code.code % 10);
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
+ if (code.code >= this.CODE_G_START) {
+ codeFrequency |= 1 << 4 - i;
+ }
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ if (i !== 4) {
+ offset = this._nextSet(this._row, code.end);
+ offset = this._nextUnset(this._row, offset);
+ }
+ }
-/**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function hashHas(key) {
- var data = this.__data__;
- return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
-}
+ if (result.length !== 5) {
+ return null;
+ }
-module.exports = hashHas;
+ if (this._extensionChecksum(result) !== this._determineCheckDigit(codeFrequency)) {
+ return null;
+ }
+ return {
+ code: result.join(''),
+ decodedCodes: decodedCodes,
+ end: code.end
+ };
+ }
+ }, {
+ key: "_determineCheckDigit",
+ value: function _determineCheckDigit(codeFrequency) {
+ for (var i = 0; i < 10; i++) {
+ if (codeFrequency === this.CHECK_DIGIT_ENCODINGS[i]) {
+ return i;
+ }
+ }
-/***/ }),
-/* 126 */
-/***/ (function(module, exports, __webpack_require__) {
+ return null;
+ }
+ }, {
+ key: "_extensionChecksum",
+ value: function _extensionChecksum(result) {
+ var length = result.length;
+ var sum = 0;
-var nativeCreate = __webpack_require__(16);
+ for (var i = length - 2; i >= 0; i -= 2) {
+ sum += result[i];
+ }
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ sum *= 3;
-/**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
-function hashSet(key, value) {
- var data = this.__data__;
- this.size += this.has(key) ? 0 : 1;
- data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
- return this;
-}
+ for (var _i = length - 1; _i >= 0; _i -= 2) {
+ sum += result[_i];
+ }
-module.exports = hashSet;
+ sum *= 3;
+ return sum % 10;
+ }
+ }]);
+ return EAN5Reader;
+}(_ean_reader__WEBPACK_IMPORTED_MODULE_5__["EANReader"]);
/***/ }),
-/* 127 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseCreate = __webpack_require__(91),
- getPrototype = __webpack_require__(39),
- isPrototype = __webpack_require__(40);
-
-/**
- * Initializes an object clone.
- *
- * @private
- * @param {Object} object The object to clone.
- * @returns {Object} Returns the initialized clone.
- */
-function initCloneObject(object) {
- return (typeof object.constructor == 'function' && !isPrototype(object))
- ? baseCreate(getPrototype(object))
- : {};
-}
-module.exports = initCloneObject;
+/***/ "./src/reader/ean-8-reader.ts":
+/*!************************************!*\
+ !*** ./src/reader/ean-8-reader.ts ***!
+ \************************************/
+/*! exports provided: EAN8Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EAN8Reader", function() { return EAN8Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
-/***/ }),
-/* 128 */
-/***/ (function(module, exports, __webpack_require__) {
-var Symbol = __webpack_require__(11),
- isArguments = __webpack_require__(18),
- isArray = __webpack_require__(2);
-/** Built-in value references. */
-var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
-/**
- * Checks if `value` is a flattenable `arguments` object or array.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
- */
-function isFlattenable(value) {
- return isArray(value) || isArguments(value) ||
- !!(spreadableSymbol && value && value[spreadableSymbol]);
-}
-module.exports = isFlattenable;
+var EAN8Reader =
+/*#__PURE__*/
+function (_EANReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EAN8Reader, _EANReader);
-/***/ }),
-/* 129 */
-/***/ (function(module, exports, __webpack_require__) {
+ function EAN8Reader(config, supplements) {
+ var _this;
-var eq = __webpack_require__(17),
- isArrayLike = __webpack_require__(24),
- isIndex = __webpack_require__(15),
- isObject = __webpack_require__(0);
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EAN8Reader);
-/**
- * Checks if the given arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
- * else `false`.
- */
-function isIterateeCall(value, index, object) {
- if (!isObject(object)) {
- return false;
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EAN8Reader).call(this, config, supplements));
+ _this._format = 'ean_8';
+ return _this;
}
- var type = typeof index;
- if (type == 'number'
- ? (isArrayLike(object) && isIndex(index, object.length))
- : (type == 'string' && index in object)
- ) {
- return eq(object[index], value);
- }
- return false;
-}
-module.exports = isIterateeCall;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EAN8Reader, [{
+ key: "_decodePayload",
+ value: function _decodePayload(code, result, decodedCodes) {
+ for (var i = 0; i < 4; i++) {
+ code = this._decodeCode(code.end, this.CODE_G_START);
+ if (!code) {
+ return null;
+ }
-/***/ }),
-/* 130 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var isArray = __webpack_require__(2),
- isSymbol = __webpack_require__(27);
+ result.push(code.code);
+ decodedCodes.push(code);
+ }
-/** Used to match property names within property paths. */
-var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
- reIsPlainProp = /^\w*$/;
+ code = this._findPattern(this.MIDDLE_PATTERN, code.end, 1, false);
-/**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
-function isKey(value, object) {
- if (isArray(value)) {
- return false;
- }
- var type = typeof value;
- if (type == 'number' || type == 'symbol' || type == 'boolean' ||
- value == null || isSymbol(value)) {
- return true;
- }
- return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
- (object != null && value in Object(object));
-}
+ if (code === null) {
+ return null;
+ }
-module.exports = isKey;
+ decodedCodes.push(code);
+ for (var _i = 0; _i < 4; _i++) {
+ code = this._decodeCode(code.end, this.CODE_G_START);
-/***/ }),
-/* 131 */
-/***/ (function(module, exports) {
+ if (!code) {
+ return null;
+ }
-/**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
-function isKeyable(value) {
- var type = typeof value;
- return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
- ? (value !== '__proto__')
- : (value === null);
-}
+ decodedCodes.push(code);
+ result.push(code.code);
+ }
-module.exports = isKeyable;
+ return code;
+ }
+ }]);
+ return EAN8Reader;
+}(_ean_reader__WEBPACK_IMPORTED_MODULE_5__["EANReader"]);
/***/ }),
-/* 132 */
-/***/ (function(module, exports, __webpack_require__) {
-var coreJsData = __webpack_require__(115);
+/***/ "./src/reader/ean-reader.ts":
+/*!**********************************!*\
+ !*** ./src/reader/ean-reader.ts ***!
+ \**********************************/
+/*! exports provided: EANReader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/** Used to detect methods masquerading as native. */
-var maskSrcKey = (function() {
- var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
- return uid ? ('Symbol(src)_1.' + uid) : '';
-}());
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EANReader", function() { return EANReader; });
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _common_merge__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../common/merge */ "./src/common/merge.ts");
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-/**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
-function isMasked(func) {
- return !!maskSrcKey && (maskSrcKey in func);
-}
-module.exports = isMasked;
-/***/ }),
-/* 133 */
-/***/ (function(module, exports) {
-/**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
-function listCacheClear() {
- this.__data__ = [];
- this.size = 0;
-}
-module.exports = listCacheClear;
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-/***/ }),
-/* 134 */
-/***/ (function(module, exports, __webpack_require__) {
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-var assocIndexOf = __webpack_require__(12);
-/** Used for built-in method references. */
-var arrayProto = Array.prototype;
-/** Built-in value references. */
-var splice = arrayProto.splice;
+var EXTENSION_START_PATTERN = [1, 1, 2];
+var CODE_PATTERN = [[3, 2, 1, 1], [2, 2, 2, 1], [2, 1, 2, 2], [1, 4, 1, 1], [1, 1, 3, 2], [1, 2, 3, 1], [1, 1, 1, 4], [1, 3, 1, 2], [1, 2, 1, 3], [3, 1, 1, 2], [1, 1, 2, 3], [1, 2, 2, 2], [2, 2, 1, 2], [1, 1, 4, 1], [2, 3, 1, 1], [1, 3, 2, 1], [4, 1, 1, 1], [2, 1, 3, 1], [3, 1, 2, 1], [2, 1, 1, 3]];
+var CODE_FREQUENCY = [0, 11, 13, 14, 19, 25, 28, 21, 22, 26];
+var EANReader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(EANReader, _BarcodeReader);
-/**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function listCacheDelete(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(EANReader, [{
+ key: "CODE_L_START",
+ get: function get() {
+ return 0;
+ }
+ }, {
+ key: "CODE_G_START",
+ get: function get() {
+ return 10;
+ }
+ }, {
+ key: "START_PATTERN",
+ get: function get() {
+ return [1, 1, 1];
+ }
+ }, {
+ key: "STOP_PATTERN",
+ get: function get() {
+ return [1, 1, 1];
+ }
+ }, {
+ key: "MIDDLE_PATTERN",
+ get: function get() {
+ return [1, 1, 1, 1, 1];
+ }
+ }]);
- if (index < 0) {
- return false;
- }
- var lastIndex = data.length - 1;
- if (index == lastIndex) {
- data.pop();
- } else {
- splice.call(data, index, 1);
- }
- --this.size;
- return true;
-}
+ function EANReader(config, supplements) {
+ var _this;
-module.exports = listCacheDelete;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, EANReader);
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EANReader).call(this, Object(_common_merge__WEBPACK_IMPORTED_MODULE_6__["merge"])({
+ supplements: [] // Allowed extensions to be decoded (2 and/or 5)
-/***/ }),
-/* 135 */
-/***/ (function(module, exports, __webpack_require__) {
+ }, config), supplements));
+ _this._format = 'ean_13';
+ _this._singleCodeError = 0.70;
+ _this._averageCodeError = 0.48;
+ return _this;
+ }
-var assocIndexOf = __webpack_require__(12);
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(EANReader, [{
+ key: "_decodeCode",
+ value: function _decodeCode(start, coderange) {
+ var counter = [0, 0, 0, 0];
+ var offset = start;
+ var bestMatch = {
+ error: Number.MAX_VALUE,
+ code: -1,
+ start: start,
+ end: start
+ };
+ var epsilon = this.AVERAGE_CODE_ERROR;
+ var isWhite = this._row[offset] ? 0 : 1;
+ var counterPos = 0;
-/**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function listCacheGet(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
+ if (!coderange) {
+ coderange = CODE_PATTERN.length;
+ }
- return index < 0 ? undefined : data[index][1];
-}
+ for (var i = offset; i < this._row.length; i++) {
+ if (this._row[i] ^ isWhite) {
+ counter[counterPos]++;
+ } else {
+ if (counterPos === counter.length - 1) {
+ for (var code = 0; code < coderange; code++) {
+ var error = this._matchPattern(counter, CODE_PATTERN[code]);
+
+ if (error < bestMatch.error) {
+ bestMatch.code = code;
+ bestMatch.error = error;
+ }
+ }
-module.exports = listCacheGet;
+ bestMatch.end = i;
+ if (bestMatch.error > epsilon) {
+ return null;
+ }
-/***/ }),
-/* 136 */
-/***/ (function(module, exports, __webpack_require__) {
+ return bestMatch;
+ } else {
+ counterPos++;
+ }
-var assocIndexOf = __webpack_require__(12);
+ counter[counterPos] = 1;
+ isWhite = isWhite ? 0 : 1;
+ }
+ }
-/**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function listCacheHas(key) {
- return assocIndexOf(this.__data__, key) > -1;
-}
+ return null;
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var offset = this._nextSet(this._row);
-module.exports = listCacheHas;
+ var startInfo;
+ while (!startInfo) {
+ startInfo = this._findPattern(this.START_PATTERN, offset, 0, true);
-/***/ }),
-/* 137 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!startInfo) {
+ return null;
+ }
-var assocIndexOf = __webpack_require__(12);
+ var leadingWhitespaceStart = startInfo.start - (startInfo.end - startInfo.start);
-/**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
-function listCacheSet(key, value) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
+ if (leadingWhitespaceStart >= 0) {
+ if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
+ return startInfo;
+ }
+ }
- if (index < 0) {
- ++this.size;
- data.push([key, value]);
- } else {
- data[index][1] = value;
- }
- return this;
-}
+ offset = startInfo.end;
+ startInfo = null;
+ }
-module.exports = listCacheSet;
+ return null;
+ }
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(endInfo) {
+ var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start);
+ if (trailingWhitespaceEnd < this._row.length) {
+ if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
+ return endInfo;
+ }
+ }
-/***/ }),
-/* 138 */
-/***/ (function(module, exports, __webpack_require__) {
+ return null;
+ }
+ }, {
+ key: "_findEnd",
+ value: function _findEnd(offset, isWhite) {
+ var endInfo = this._findPattern(this.STOP_PATTERN, offset, isWhite, false);
-var Hash = __webpack_require__(84),
- ListCache = __webpack_require__(10),
- Map = __webpack_require__(33);
+ return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
+ }
+ }, {
+ key: "_calculateFirstDigit",
+ value: function _calculateFirstDigit(codeFrequency) {
+ for (var i = 0; i < CODE_FREQUENCY.length; i++) {
+ if (codeFrequency === CODE_FREQUENCY[i]) {
+ return i;
+ }
+ }
-/**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
-function mapCacheClear() {
- this.size = 0;
- this.__data__ = {
- 'hash': new Hash,
- 'map': new (Map || ListCache),
- 'string': new Hash
- };
-}
+ return null;
+ }
+ }, {
+ key: "_decodePayload",
+ value: function _decodePayload(code, result, decodedCodes) {
+ var codeFrequency = 0x0;
-module.exports = mapCacheClear;
+ for (var i = 0; i < 6; i++) {
+ code = this._decodeCode(code.end);
+ if (!code) {
+ return null;
+ }
-/***/ }),
-/* 139 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (code.code >= this.CODE_G_START) {
+ code.code -= this.CODE_G_START;
+ codeFrequency |= 1 << 5 - i;
+ } else {
+ codeFrequency |= 0 << 5 - i;
+ }
-var getMapData = __webpack_require__(14);
+ result.push(code.code);
+ decodedCodes.push(code);
+ }
-/**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function mapCacheDelete(key) {
- var result = getMapData(this, key)['delete'](key);
- this.size -= result ? 1 : 0;
- return result;
-}
+ var firstDigit = this._calculateFirstDigit(codeFrequency);
-module.exports = mapCacheDelete;
+ if (firstDigit === null) {
+ return null;
+ }
+ result.unshift(firstDigit);
+ code = this._findPattern(this.MIDDLE_PATTERN, code.end, 1, false);
-/***/ }),
-/* 140 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (code === null) {
+ return null;
+ }
-var getMapData = __webpack_require__(14);
+ decodedCodes.push(code);
-/**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function mapCacheGet(key) {
- return getMapData(this, key).get(key);
-}
+ for (var _i = 0; _i < 6; _i++) {
+ code = this._decodeCode(code.end, this.CODE_G_START);
-module.exports = mapCacheGet;
+ if (!code) {
+ return null;
+ }
+ decodedCodes.push(code);
+ result.push(code.code);
+ }
-/***/ }),
-/* 141 */
-/***/ (function(module, exports, __webpack_require__) {
+ return code;
+ }
+ }, {
+ key: "decode",
+ value: function decode() {
+ var result = new Array();
+ var decodedCodes = new Array();
+ var resultInfo = {};
-var getMapData = __webpack_require__(14);
+ var startInfo = this._findStart();
-/**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function mapCacheHas(key) {
- return getMapData(this, key).has(key);
-}
+ if (!startInfo) {
+ return null;
+ }
-module.exports = mapCacheHas;
+ var code = {
+ code: startInfo.code,
+ start: startInfo.start,
+ end: startInfo.end
+ };
+ decodedCodes.push(code);
+ code = this._decodePayload(code, result, decodedCodes);
+ if (!code) {
+ return null;
+ }
-/***/ }),
-/* 142 */
-/***/ (function(module, exports, __webpack_require__) {
+ code = this._findEnd(code.end, 0);
-var getMapData = __webpack_require__(14);
+ if (!code) {
+ return null;
+ }
-/**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
-function mapCacheSet(key, value) {
- var data = getMapData(this, key),
- size = data.size;
+ decodedCodes.push(code); // Checksum
- data.set(key, value);
- this.size += data.size == size ? 0 : 1;
- return this;
-}
+ if (!this._checksum(result)) {
+ return null;
+ }
-module.exports = mapCacheSet;
+ if (this.supplements.length > 0) {
+ var supplement = this._decodeExtensions(code.end);
+ if (!supplement) {
+ return null;
+ }
-/***/ }),
-/* 143 */
-/***/ (function(module, exports, __webpack_require__) {
+ var lastCode = supplement.decodedCodes[supplement.decodedCodes.length - 1];
+ var endInfo = {
+ start: lastCode.start + ((lastCode.end - lastCode.start) / 2 | 0),
+ end: lastCode.end
+ };
-var memoize = __webpack_require__(161);
+ if (!this._verifyTrailingWhitespace(endInfo)) {
+ return null;
+ }
-/** Used as the maximum memoize cache size. */
-var MAX_MEMOIZE_SIZE = 500;
+ resultInfo = {
+ supplement: supplement,
+ code: result.join('') + supplement.code
+ };
+ }
-/**
- * A specialized version of `_.memoize` which clears the memoized function's
- * cache when it exceeds `MAX_MEMOIZE_SIZE`.
- *
- * @private
- * @param {Function} func The function to have its output memoized.
- * @returns {Function} Returns the new memoized function.
- */
-function memoizeCapped(func) {
- var result = memoize(func, function(key) {
- if (cache.size === MAX_MEMOIZE_SIZE) {
- cache.clear();
+ return _objectSpread({
+ code: result.join(''),
+ start: startInfo.start,
+ end: code.end,
+ startInfo: startInfo,
+ decodedCodes: decodedCodes
+ }, resultInfo);
}
- return key;
- });
+ }, {
+ key: "_decodeExtensions",
+ value: function _decodeExtensions(offset) {
+ var start = this._nextSet(this._row, offset);
- var cache = result.cache;
- return result;
-}
+ var startInfo = this._findPattern(EXTENSION_START_PATTERN, start, 0, false);
-module.exports = memoizeCapped;
+ if (startInfo === null) {
+ return null;
+ }
+ for (var i = 0; i < this.supplements.length; i++) {
+ var result = this.supplements[i].decode(this._row, startInfo.end);
-/***/ }),
-/* 144 */
-/***/ (function(module, exports) {
+ if (result !== null) {
+ return {
+ code: result.code,
+ start: start,
+ startInfo: startInfo,
+ end: result.end,
+ decodedCodes: result.decodedCodes
+ };
+ }
+ }
-/**
- * This function is like
- * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * except that it includes inherited enumerable properties.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function nativeKeysIn(object) {
- var result = [];
- if (object != null) {
- for (var key in Object(object)) {
- result.push(key);
+ return null;
}
- }
- return result;
-}
-
-module.exports = nativeKeysIn;
-
-
-/***/ }),
-/* 145 */
-/***/ (function(module, exports, __webpack_require__) {
+ }, {
+ key: "_checksum",
+ value: function _checksum(result) {
+ var sum = 0;
-/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(38);
+ for (var i = result.length - 2; i >= 0; i -= 2) {
+ sum += result[i];
+ }
-/** Detect free variable `exports`. */
-var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+ sum *= 3;
-/** Detect free variable `module`. */
-var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+ for (var _i2 = result.length - 1; _i2 >= 0; _i2 -= 2) {
+ sum += result[_i2];
+ }
-/** Detect the popular CommonJS extension `module.exports`. */
-var moduleExports = freeModule && freeModule.exports === freeExports;
+ return sum % 10 === 0;
+ }
+ }]);
-/** Detect free variable `process` from Node.js. */
-var freeProcess = moduleExports && freeGlobal.process;
+ return EANReader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_7__["BarcodeReader"]);
-/** Used to access faster Node.js helpers. */
-var nodeUtil = (function() {
- try {
- return freeProcess && freeProcess.binding && freeProcess.binding('util');
- } catch (e) {}
-}());
+/***/ }),
-module.exports = nodeUtil;
+/***/ "./src/reader/i2of5-reader.ts":
+/*!************************************!*\
+ !*** ./src/reader/i2of5-reader.ts ***!
+ \************************************/
+/*! exports provided: I2of5Reader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(29)(module)))
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I2of5Reader", function() { return I2of5Reader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
+/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "../../node_modules/@babel/runtime/helpers/get.js");
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../../node_modules/@babel/runtime/helpers/defineProperty.js");
+/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _common_merge__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/merge */ "./src/common/merge.ts");
+/* harmony import */ var _barcode_reader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./barcode-reader */ "./src/reader/barcode-reader.ts");
-/***/ }),
-/* 146 */
-/***/ (function(module, exports) {
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var nativeObjectToString = objectProto.toString;
-/**
- * Converts `value` to a string using `Object.prototype.toString`.
- *
- * @private
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- */
-function objectToString(value) {
- return nativeObjectToString.call(value);
-}
-module.exports = objectToString;
-/***/ }),
-/* 147 */
-/***/ (function(module, exports) {
-/**
- * Creates a unary function that invokes `func` with its argument transformed.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
- */
-function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
-}
-module.exports = overArg;
+var N = 1;
+var W = 3;
+var START_PATTERN = [N, N, N, N];
+var STOP_PATTERN = [N, N, W];
+var CODE_PATTERN = [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]];
+var MAX_CORRECTION_FACTOR = 5;
+var I2of5Reader =
+/*#__PURE__*/
+function (_BarcodeReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(I2of5Reader, _BarcodeReader);
-/***/ }),
-/* 148 */
-/***/ (function(module, exports) {
+ function I2of5Reader(config) {
+ var _this;
-/** Used to detect hot functions by number of calls within a span of milliseconds. */
-var HOT_COUNT = 800,
- HOT_SPAN = 16;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, I2of5Reader);
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeNow = Date.now;
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(I2of5Reader).call(this, Object(_common_merge__WEBPACK_IMPORTED_MODULE_8__["merge"])({
+ normalizeBarSpaceWidth: false // Normalize the width difference between bars and spaces
-/**
- * Creates a function that'll short out and invoke `identity` instead
- * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
- * milliseconds.
- *
- * @private
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new shortable function.
- */
-function shortOut(func) {
- var count = 0,
- lastCalled = 0;
+ }, config)));
- return function() {
- var stamp = nativeNow(),
- remaining = HOT_SPAN - (stamp - lastCalled);
+ _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7___default()(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default()(_this), "_barSpaceRatio", void 0);
- lastCalled = stamp;
- if (remaining > 0) {
- if (++count >= HOT_COUNT) {
- return arguments[0];
- }
+ _this._barSpaceRatio = [1, 1];
+ _this._format = 'i2of5';
+
+ if (_this.config.normalizeBarSpaceWidth) {
+ _this._singleCodeError = 0.38;
+ _this._averageCodeError = 0.09;
} else {
- count = 0;
+ _this._singleCodeError = 0.78;
+ _this._averageCodeError = 0.38;
}
- return func.apply(undefined, arguments);
- };
-}
-module.exports = shortOut;
+ return _this;
+ }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(I2of5Reader, [{
+ key: "decode",
+ value: function decode() {
+ var startInfo = this._findStart();
-/***/ }),
-/* 149 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!startInfo) {
+ return null;
+ }
-var ListCache = __webpack_require__(10);
+ var endInfo = this._findEnd();
-/**
- * Removes all key-value entries from the stack.
- *
- * @private
- * @name clear
- * @memberOf Stack
- */
-function stackClear() {
- this.__data__ = new ListCache;
- this.size = 0;
-}
+ if (!endInfo) {
+ return null;
+ }
-module.exports = stackClear;
+ var counters = this._fillCounters(startInfo.end, endInfo.start, 0);
+ if (counters.length % 10 !== 0) {
+ return null;
+ }
-/***/ }),
-/* 150 */
-/***/ (function(module, exports) {
+ var result = new Array();
+ var decodedCodes = new Array();
+ decodedCodes.push(startInfo);
-/**
- * Removes `key` and its value from the stack.
- *
- * @private
- * @name delete
- * @memberOf Stack
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function stackDelete(key) {
- var data = this.__data__,
- result = data['delete'](key);
+ var code = this._decodePayload(counters, result, decodedCodes);
- this.size = data.size;
- return result;
-}
+ if (!code || result.length % 2 !== 0 || result.length < 6) {
+ return null;
+ }
-module.exports = stackDelete;
+ decodedCodes.push(endInfo);
+ return {
+ code: result.join(''),
+ start: startInfo.start,
+ end: endInfo.end,
+ startInfo: startInfo,
+ decodedCodes: decodedCodes
+ };
+ }
+ }, {
+ key: "_matchPattern",
+ value: function _matchPattern(counter, code) {
+ if (this.config.normalizeBarSpaceWidth) {
+ var counterSum = [0, 0];
+ var codeSum = [0, 0];
+ var correction = [0, 0];
+ var correctionRatio = MAX_CORRECTION_FACTOR;
+ var correctionRatioInverse = 1 / correctionRatio;
+ for (var i = 0; i < counter.length; i++) {
+ counterSum[i % 2] += counter[i];
+ codeSum[i % 2] += code[i];
+ }
-/***/ }),
-/* 151 */
-/***/ (function(module, exports) {
+ correction[0] = codeSum[0] / counterSum[0];
+ correction[1] = codeSum[1] / counterSum[1];
+ correction[0] = Math.max(Math.min(correction[0], correctionRatio), correctionRatioInverse);
+ correction[1] = Math.max(Math.min(correction[1], correctionRatio), correctionRatioInverse);
+ this._barSpaceRatio = correction;
-/**
- * Gets the stack value for `key`.
- *
- * @private
- * @name get
- * @memberOf Stack
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function stackGet(key) {
- return this.__data__.get(key);
-}
+ for (var _i = 0; _i < counter.length; _i++) {
+ counter[_i] *= this._barSpaceRatio[_i % 2];
+ }
+ }
-module.exports = stackGet;
+ return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(I2of5Reader.prototype), "_matchPattern", this).call(this, counter, code);
+ }
+ }, {
+ key: "_findStart",
+ value: function _findStart() {
+ var offset = this._nextSet(this._row);
+ var startInfo;
-/***/ }),
-/* 152 */
-/***/ (function(module, exports) {
+ while (!startInfo) {
+ startInfo = this._findPattern(START_PATTERN, offset, 0, true);
-/**
- * Checks if a stack value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Stack
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function stackHas(key) {
- return this.__data__.has(key);
-}
+ if (!startInfo) {
+ return null;
+ }
-module.exports = stackHas;
+ var narrowBarWidth = startInfo.end - startInfo.start >> 2;
+ var leadingWhitespaceStart = startInfo.start - narrowBarWidth * 10;
+ if (leadingWhitespaceStart >= 0) {
+ if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) {
+ return startInfo;
+ }
+ }
-/***/ }),
-/* 153 */
-/***/ (function(module, exports, __webpack_require__) {
+ offset = startInfo.end;
+ startInfo = null;
+ }
-var ListCache = __webpack_require__(10),
- Map = __webpack_require__(33),
- MapCache = __webpack_require__(34);
+ return null;
+ }
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(endInfo) {
+ var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
+ if (trailingWhitespaceEnd < this._row.length) {
+ if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
+ return endInfo;
+ }
+ }
-/**
- * Sets the stack `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Stack
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the stack cache instance.
- */
-function stackSet(key, value) {
- var data = this.__data__;
- if (data instanceof ListCache) {
- var pairs = data.__data__;
- if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
- pairs.push([key, value]);
- this.size = ++data.size;
- return this;
+ return null;
}
- data = this.__data__ = new MapCache(pairs);
- }
- data.set(key, value);
- this.size = data.size;
- return this;
-}
+ }, {
+ key: "_findEnd",
+ value: function _findEnd() {
+ this._row.reverse();
-module.exports = stackSet;
+ var endInfo = this._findPattern(STOP_PATTERN, undefined, 0, false);
+ this._row.reverse();
-/***/ }),
-/* 154 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (endInfo === null) {
+ return null;
+ } // reverse numbers
-var memoizeCapped = __webpack_require__(143);
-/** Used to match property names within property paths. */
-var reLeadingDot = /^\./,
- rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+ var start = endInfo.start;
+ endInfo.start = this._row.length - endInfo.end;
+ endInfo.end = this._row.length - start;
+ return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null;
+ }
+ }, {
+ key: "_decodeCode",
+ value: function _decodeCode(counter) {
+ var bestMatch = {
+ error: Number.MAX_VALUE,
+ code: -1,
+ start: 0,
+ end: 0
+ };
-/** Used to match backslashes in property paths. */
-var reEscapeChar = /\\(\\)?/g;
+ for (var code = 0; code < CODE_PATTERN.length; code++) {
+ var error = this._matchPattern(counter, CODE_PATTERN[code]);
-/**
- * Converts `string` to a property path array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the property path array.
- */
-var stringToPath = memoizeCapped(function(string) {
- var result = [];
- if (reLeadingDot.test(string)) {
- result.push('');
- }
- string.replace(rePropName, function(match, number, quote, string) {
- result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
- });
- return result;
-});
+ if (error < bestMatch.error) {
+ bestMatch.code = code;
+ bestMatch.error = error;
+ }
+ }
+
+ return bestMatch.error < this.AVERAGE_CODE_ERROR ? bestMatch : null;
+ }
+ }, {
+ key: "_decodePayload",
+ value: function _decodePayload(counters, result, decodedCodes) {
+ var counterLength = counters.length;
+ var counter0 = [0, 0, 0, 0, 0];
+ var counter1 = [0, 0, 0, 0, 0];
+ var code0;
+ var code1;
+ var pos = 0;
-module.exports = stringToPath;
+ while (pos < counterLength) {
+ for (var i = 0; i < 5; i++) {
+ counter0[i] = counters[pos] * this._barSpaceRatio[0];
+ counter1[i] = counters[pos + 1] * this._barSpaceRatio[1];
+ pos += 2;
+ }
+ code0 = this._decodeCode(counter0);
-/***/ }),
-/* 155 */
-/***/ (function(module, exports) {
+ if (!code0) {
+ return null;
+ }
-/** Used for built-in method references. */
-var funcProto = Function.prototype;
+ code1 = this._decodeCode(counter1);
-/** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
+ if (!code1) {
+ return null;
+ }
-/**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to convert.
- * @returns {string} Returns the source code.
- */
-function toSource(func) {
- if (func != null) {
- try {
- return funcToString.call(func);
- } catch (e) {}
- try {
- return (func + '');
- } catch (e) {}
- }
- return '';
-}
+ result.push(code0.code, code1.code);
+ decodedCodes.push(code0, code1);
+ }
-module.exports = toSource;
+ return [code0, code1];
+ }
+ }]);
+ return I2of5Reader;
+}(_barcode_reader__WEBPACK_IMPORTED_MODULE_9__["BarcodeReader"]);
/***/ }),
-/* 156 */
-/***/ (function(module, exports) {
-/**
- * Creates a function that returns `value`.
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Util
- * @param {*} value The value to return from the new function.
- * @returns {Function} Returns the new constant function.
- * @example
- *
- * var objects = _.times(2, _.constant({ 'a': 1 }));
- *
- * console.log(objects);
- * // => [{ 'a': 1 }, { 'a': 1 }]
- *
- * console.log(objects[0] === objects[1]);
- * // => true
- */
-function constant(value) {
- return function() {
- return value;
- };
-}
+/***/ "./src/reader/index.ts":
+/*!*****************************!*\
+ !*** ./src/reader/index.ts ***!
+ \*****************************/
+/*! exports provided: Readers */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-module.exports = constant;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Readers", function() { return Readers; });
+/* harmony import */ var _code_128_reader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./code-128-reader */ "./src/reader/code-128-reader.ts");
+/* harmony import */ var _code_39_reader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./code-39-reader */ "./src/reader/code-39-reader.ts");
+/* harmony import */ var _code_39_vin_reader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./code-39-vin-reader */ "./src/reader/code-39-vin-reader.ts");
+/* harmony import */ var _codabar_reader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./codabar-reader */ "./src/reader/codabar-reader.ts");
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
+/* harmony import */ var _ean_8_reader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ean-8-reader */ "./src/reader/ean-8-reader.ts");
+/* harmony import */ var _ean_2_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ean-2-reader */ "./src/reader/ean-2-reader.ts");
+/* harmony import */ var _ean_5_reader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ean-5-reader */ "./src/reader/ean-5-reader.ts");
+/* harmony import */ var _upc_reader__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./upc-reader */ "./src/reader/upc-reader.ts");
+/* harmony import */ var _upc_e_reader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./upc-e-reader */ "./src/reader/upc-e-reader.ts");
+/* harmony import */ var _i2of5_reader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./i2of5-reader */ "./src/reader/i2of5-reader.ts");
+/* harmony import */ var _2of5_reader__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./2of5-reader */ "./src/reader/2of5-reader.ts");
+/* harmony import */ var _code_93_reader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./code-93-reader */ "./src/reader/code-93-reader.ts");
-/***/ }),
-/* 157 */
-/***/ (function(module, exports, __webpack_require__) {
-var baseFlatten = __webpack_require__(92);
-/**
- * Flattens `array` a single level deep.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Array
- * @param {Array} array The array to flatten.
- * @returns {Array} Returns the new flattened array.
- * @example
- *
- * _.flatten([1, [2, [3, [4]], 5]]);
- * // => [1, 2, [3, [4]], 5]
- */
-function flatten(array) {
- var length = array == null ? 0 : array.length;
- return length ? baseFlatten(array, 1) : [];
-}
-module.exports = flatten;
-/***/ }),
-/* 158 */
-/***/ (function(module, exports, __webpack_require__) {
-var baseHasIn = __webpack_require__(95),
- hasPath = __webpack_require__(121);
-/**
- * Checks if `path` is a direct or inherited property of `object`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- * @example
- *
- * var object = _.create({ 'a': _.create({ 'b': 2 }) });
- *
- * _.hasIn(object, 'a');
- * // => true
- *
- * _.hasIn(object, 'a.b');
- * // => true
- *
- * _.hasIn(object, ['a', 'b']);
- * // => true
- *
- * _.hasIn(object, 'b');
- * // => false
- */
-function hasIn(object, path) {
- return object != null && hasPath(object, path, baseHasIn);
-}
-module.exports = hasIn;
+
+var Readers = {
+ code_128_reader: _code_128_reader__WEBPACK_IMPORTED_MODULE_0__["Code128Reader"],
+ ean_reader: _ean_reader__WEBPACK_IMPORTED_MODULE_4__["EANReader"],
+ ean_5_reader: _ean_5_reader__WEBPACK_IMPORTED_MODULE_7__["EAN5Reader"],
+ ean_2_reader: _ean_2_reader__WEBPACK_IMPORTED_MODULE_6__["EAN2Reader"],
+ ean_8_reader: _ean_8_reader__WEBPACK_IMPORTED_MODULE_5__["EAN8Reader"],
+ code_39_reader: _code_39_reader__WEBPACK_IMPORTED_MODULE_1__["Code39Reader"],
+ code_39_vin_reader: _code_39_vin_reader__WEBPACK_IMPORTED_MODULE_2__["Code39VINReader"],
+ codabar_reader: _codabar_reader__WEBPACK_IMPORTED_MODULE_3__["CodabarReader"],
+ upc_reader: _upc_reader__WEBPACK_IMPORTED_MODULE_8__["UPCReader"],
+ upc_e_reader: _upc_e_reader__WEBPACK_IMPORTED_MODULE_9__["UPCEReader"],
+ i2of5_reader: _i2of5_reader__WEBPACK_IMPORTED_MODULE_10__["I2of5Reader"],
+ '2of5_reader': _2of5_reader__WEBPACK_IMPORTED_MODULE_11__["TwoOfFiveReader"],
+ code_93_reader: _code_93_reader__WEBPACK_IMPORTED_MODULE_12__["Code93Reader"]
+};
+
/***/ }),
-/* 159 */
-/***/ (function(module, exports, __webpack_require__) {
-var isArrayLike = __webpack_require__(24),
- isObjectLike = __webpack_require__(6);
+/***/ "./src/reader/upc-e-reader.ts":
+/*!************************************!*\
+ !*** ./src/reader/upc-e-reader.ts ***!
+ \************************************/
+/*! exports provided: UPCEReader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-/**
- * This method is like `_.isArrayLike` except that it also checks if `value`
- * is an object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array-like object,
- * else `false`.
- * @example
- *
- * _.isArrayLikeObject([1, 2, 3]);
- * // => true
- *
- * _.isArrayLikeObject(document.body.children);
- * // => true
- *
- * _.isArrayLikeObject('abc');
- * // => false
- *
- * _.isArrayLikeObject(_.noop);
- * // => false
- */
-function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
-}
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UPCEReader", function() { return UPCEReader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "../../node_modules/@babel/runtime/helpers/get.js");
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
-module.exports = isArrayLikeObject;
-/***/ }),
-/* 160 */
-/***/ (function(module, exports, __webpack_require__) {
-var baseGetTag = __webpack_require__(8),
- getPrototype = __webpack_require__(39),
- isObjectLike = __webpack_require__(6);
-/** `Object#toString` result references. */
-var objectTag = '[object Object]';
-/** Used for built-in method references. */
-var funcProto = Function.prototype,
- objectProto = Object.prototype;
-/** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
+var CODE_FREQUENCY = [[56, 52, 50, 49, 44, 38, 35, 42, 41, 37], [7, 11, 13, 14, 19, 25, 28, 21, 22, 26]];
+var UPCEReader =
+/*#__PURE__*/
+function (_EANReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(UPCEReader, _EANReader);
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(UPCEReader, [{
+ key: "STOP_PATTERN",
+ get: function get() {
+ return [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7];
+ }
+ }]);
-/** Used to infer the `Object` constructor. */
-var objectCtorString = funcToString.call(Object);
+ function UPCEReader(config, supplements) {
+ var _this;
-/**
- * Checks if `value` is a plain object, that is, an object created by the
- * `Object` constructor or one with a `[[Prototype]]` of `null`.
- *
- * @static
- * @memberOf _
- * @since 0.8.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * }
- *
- * _.isPlainObject(new Foo);
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'x': 0, 'y': 0 });
- * // => true
- *
- * _.isPlainObject(Object.create(null));
- * // => true
- */
-function isPlainObject(value) {
- if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UPCEReader);
+
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(UPCEReader).call(this, config, supplements));
+ _this._format = 'upc_e';
+ return _this;
}
- var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
- return typeof Ctor == 'function' && Ctor instanceof Ctor &&
- funcToString.call(Ctor) == objectCtorString;
-}
-module.exports = isPlainObject;
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(UPCEReader, [{
+ key: "_decodePayload",
+ value: function _decodePayload(code, result, decodedCodes) {
+ var codeFrequency = 0x0;
+ for (var i = 0; i < 6; i++) {
+ code = this._decodeCode(code.end);
-/***/ }),
-/* 161 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (!code) {
+ return null;
+ }
-var MapCache = __webpack_require__(34);
+ if (code.code >= this.CODE_G_START) {
+ code.code = code.code - this.CODE_G_START;
+ codeFrequency |= 1 << 5 - i;
+ }
-/** Error message constants. */
-var FUNC_ERROR_TEXT = 'Expected a function';
+ result.push(code.code);
+ decodedCodes.push(code);
+ }
-/**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided, it determines the cache key for storing the result based on the
- * arguments provided to the memoized function. By default, the first argument
- * provided to the memoized function is used as the map cache key. The `func`
- * is invoked with the `this` binding of the memoized function.
- *
- * **Note:** The cache is exposed as the `cache` property on the memoized
- * function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the
- * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
- * method interface of `clear`, `delete`, `get`, `has`, and `set`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] The function to resolve the cache key.
- * @returns {Function} Returns the new memoized function.
- * @example
- *
- * var object = { 'a': 1, 'b': 2 };
- * var other = { 'c': 3, 'd': 4 };
- *
- * var values = _.memoize(_.values);
- * values(object);
- * // => [1, 2]
- *
- * values(other);
- * // => [3, 4]
- *
- * object.a = 2;
- * values(object);
- * // => [1, 2]
- *
- * // Modify the result cache.
- * values.cache.set(object, ['a', 'b']);
- * values(object);
- * // => ['a', 'b']
- *
- * // Replace `_.memoize.Cache`.
- * _.memoize.Cache = WeakMap;
- */
-function memoize(func, resolver) {
- if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- var memoized = function() {
- var args = arguments,
- key = resolver ? resolver.apply(this, args) : args[0],
- cache = memoized.cache;
+ if (!this._determineParity(codeFrequency, result)) {
+ return null;
+ }
- if (cache.has(key)) {
- return cache.get(key);
+ return code;
}
- var result = func.apply(this, args);
- memoized.cache = cache.set(key, result) || cache;
- return result;
- };
- memoized.cache = new (memoize.Cache || MapCache);
- return memoized;
-}
-
-// Expose `MapCache`.
-memoize.Cache = MapCache;
-
-module.exports = memoize;
+ }, {
+ key: "_determineParity",
+ value: function _determineParity(codeFrequency, result) {
+ for (var nrSystem = 0; nrSystem < CODE_FREQUENCY.length; nrSystem++) {
+ for (var i = 0; i < CODE_FREQUENCY[nrSystem].length; i++) {
+ if (codeFrequency === CODE_FREQUENCY[nrSystem][i]) {
+ result.unshift(nrSystem);
+ result.push(i);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }, {
+ key: "_convertToUPCA",
+ value: function _convertToUPCA(result) {
+ var lastDigit = result[result.length - 2];
+ var upca = [result[0]];
-/***/ }),
-/* 162 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (lastDigit <= 2) {
+ upca = upca.concat(result.slice(1, 3)).concat([lastDigit, 0, 0, 0, 0]).concat(result.slice(3, 6));
+ } else if (lastDigit === 3) {
+ upca = upca.concat(result.slice(1, 4)).concat([0, 0, 0, 0, 0]).concat(result.slice(4, 6));
+ } else if (lastDigit === 4) {
+ upca = upca.concat(result.slice(1, 5)).concat([0, 0, 0, 0, 0, result[5]]);
+ } else {
+ upca = upca.concat(result.slice(1, 6)).concat([0, 0, 0, 0, lastDigit]);
+ }
-var basePick = __webpack_require__(102),
- flatRest = __webpack_require__(118);
+ upca.push(result[result.length - 1]);
+ return upca;
+ }
+ }, {
+ key: "_checksum",
+ value: function _checksum(result) {
+ return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_3___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(UPCEReader.prototype), "_checksum", this).call(this, this._convertToUPCA(result));
+ }
+ }, {
+ key: "_findEnd",
+ value: function _findEnd(offset, isWhite) {
+ isWhite = 1;
+ return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_3___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(UPCEReader.prototype), "_findEnd", this).call(this, offset, isWhite);
+ }
+ }, {
+ key: "_verifyTrailingWhitespace",
+ value: function _verifyTrailingWhitespace(endInfo) {
+ var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2;
-/**
- * Creates an object composed of the picked `object` properties.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
- * @param {Object} object The source object.
- * @param {...(string|string[])} [paths] The property paths to pick.
- * @returns {Object} Returns the new object.
- * @example
- *
- * var object = { 'a': 1, 'b': '2', 'c': 3 };
- *
- * _.pick(object, ['a', 'c']);
- * // => { 'a': 1, 'c': 3 }
- */
-var pick = flatRest(function(object, paths) {
- return object == null ? {} : basePick(object, paths);
-});
+ if (trailingWhitespaceEnd < this._row.length) {
+ if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
+ return endInfo;
+ }
+ }
-module.exports = pick;
+ return null;
+ }
+ }]);
+ return UPCEReader;
+}(_ean_reader__WEBPACK_IMPORTED_MODULE_6__["EANReader"]);
/***/ }),
-/* 163 */
-/***/ (function(module, exports) {
-/**
- * This method returns `false`.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {boolean} Returns `false`.
- * @example
- *
- * _.times(2, _.stubFalse);
- * // => [false, false]
- */
-function stubFalse() {
- return false;
-}
+/***/ "./src/reader/upc-reader.ts":
+/*!**********************************!*\
+ !*** ./src/reader/upc-reader.ts ***!
+ \**********************************/
+/*! exports provided: UPCReader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
-module.exports = stubFalse;
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UPCReader", function() { return UPCReader; });
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../../node_modules/@babel/runtime/helpers/classCallCheck.js");
+/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../../node_modules/@babel/runtime/helpers/createClass.js");
+/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
+/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
+/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "../../node_modules/@babel/runtime/helpers/get.js");
+/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../../node_modules/@babel/runtime/helpers/inherits.js");
+/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _ean_reader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ean-reader */ "./src/reader/ean-reader.ts");
-/***/ }),
-/* 164 */
-/***/ (function(module, exports, __webpack_require__) {
-var copyObject = __webpack_require__(114),
- keysIn = __webpack_require__(46);
-/**
- * Converts `value` to a plain object flattening inherited enumerable string
- * keyed properties of `value` to own properties of the plain object.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {Object} Returns the converted plain object.
- * @example
- *
- * function Foo() {
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.assign({ 'a': 1 }, new Foo);
- * // => { 'a': 1, 'b': 2 }
- *
- * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
- * // => { 'a': 1, 'b': 2, 'c': 3 }
- */
-function toPlainObject(value) {
- return copyObject(value, keysIn(value));
-}
-module.exports = toPlainObject;
-/***/ }),
-/* 165 */
-/***/ (function(module, exports, __webpack_require__) {
+var UPCReader =
+/*#__PURE__*/
+function (_EANReader) {
+ _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(UPCReader, _EANReader);
-var baseToString = __webpack_require__(108);
+ function UPCReader(config, supplements) {
+ var _this;
-/**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
-function toString(value) {
- return value == null ? '' : baseToString(value);
-}
+ _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UPCReader);
-module.exports = toString;
+ _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UPCReader).call(this, config, supplements));
+ _this._format = 'upc_a';
+ return _this;
+ }
+ _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(UPCReader, [{
+ key: "decode",
+ value: function decode() {
+ var result = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UPCReader.prototype), "decode", this).call(this);
-/***/ }),
-/* 166 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (result && result.code && result.code.length === 13 && result.code.charAt(0) === '0') {
+ result.code = result.code.substring(1);
+ return result;
+ }
-module.exports = __webpack_require__(48);
+ return null;
+ }
+ }]);
+ return UPCReader;
+}(_ean_reader__WEBPACK_IMPORTED_MODULE_6__["EANReader"]);
/***/ })
-/******/ ])
+
+/******/ })
});
;
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9teU1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDc1NjBjYzQ5MjcyMzFiMmUzNzg5Iiwid2VicGFjazovLy8uL34vbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvYmFyY29kZV9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2FycmF5X2hlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZGVyL2Vhbl9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL34vZ2wtdmVjMi9jbG9uZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2ltYWdlX2RlYnVnLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYXNzb2NJbmRleE9mLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19jYXN0UGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faXNJbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2VxLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21tb24vY3ZfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbW1vbi9pbWFnZV93cmFwcGVyLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fdG9LZXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pc1N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9tZXJnZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9sb2NhdG9yL3RyYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZGVyL2NvZGVfMzlfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL34vZ2wtdmVjMi9kb3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3NldFRvU3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVhZ2dhLmpzIiwid2VicGFjazovLy8uL3NyYy9hbmFseXRpY3MvcmVzdWx0X2NvbGxlY3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2NsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbW1vbi9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbW1vbi9tZWRpYURldmljZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbW1vbi9zdWJJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL3R5cGVkZWZzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25maWcvY29uZmlnLmRldi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2NvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZGVjb2Rlci9iYXJjb2RlX2RlY29kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlY29kZXIvYnJlc2VuaGFtLmpzIiwid2VicGFjazovLy8uL3NyYy9pbnB1dC9jYW1lcmFfYWNjZXNzLmpzIiwid2VicGFjazovLy8uL3NyYy9pbnB1dC9leGlmX2hlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5wdXQvZnJhbWVfZ3JhYmJlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5wdXQvaW1hZ2VfbG9hZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9pbnB1dC9pbnB1dF9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2F0b3IvYmFyY29kZV9sb2NhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9sb2NhdG9yL3Jhc3Rlcml6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2F0b3Ivc2tlbGV0b25pemVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvMm9mNV9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWRlci9jb2RhYmFyX3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZGVyL2NvZGVfMTI4X3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZGVyL2NvZGVfMzlfdmluX3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZGVyL2NvZGVfOTNfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvZWFuXzJfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvZWFuXzVfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvZWFuXzhfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvaTJvZjVfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvdXBjX2VfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9yZWFkZXIvdXBjX3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2dsLW1hdDIvY29weS5qcyIsIndlYnBhY2s6Ly8vLi9+L2dsLW1hdDIvY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vZ2wtbWF0Mi9pbnZlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9nbC12ZWMyL3NjYWxlLmpzIiwid2VicGFjazovLy8uL34vZ2wtdmVjMi90cmFuc2Zvcm1NYXQyLmpzIiwid2VicGFjazovLy8uL34vZ2wtdmVjMy9jbG9uZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fSGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX1VpbnQ4QXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlQ3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUhhc0luLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlTWVyZ2VEZWVwLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZVBpY2tCeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2Nsb25lVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fY29weUFycmF5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19jb3B5T2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fZmxhdFJlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faGFzaEdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9faXNNYXNrZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX25vZGVVdGlsLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19zdGFja0dldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2NvbnN0YW50LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9tZW1vaXplLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL3BpY2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvdG9TdHJpbmcuanMiXSwibmFtZXMiOlsiQmFyY29kZVJlYWRlciIsImNvbmZpZyIsInN1cHBsZW1lbnRzIiwiX3JvdyIsInByb3RvdHlwZSIsIl9uZXh0VW5zZXQiLCJsaW5lIiwic3RhcnQiLCJpIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwiX21hdGNoUGF0dGVybiIsImNvdW50ZXIiLCJjb2RlIiwibWF4U2luZ2xlRXJyb3IiLCJlcnJvciIsInNpbmdsZUVycm9yIiwic3VtIiwibW9kdWxvIiwiYmFyV2lkdGgiLCJjb3VudCIsInNjYWxlZCIsIlNJTkdMRV9DT0RFX0VSUk9SIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwiTWF0aCIsImFicyIsIl9uZXh0U2V0Iiwib2Zmc2V0IiwiX2NvcnJlY3RCYXJzIiwiY29ycmVjdGlvbiIsImluZGljZXMiLCJ0bXAiLCJfbWF0Y2hUcmFjZSIsImNtcENvdW50ZXIiLCJlcHNpbG9uIiwic2VsZiIsImlzV2hpdGUiLCJjb3VudGVyUG9zIiwiYmVzdE1hdGNoIiwicHVzaCIsImVuZCIsImRlY29kZVBhdHRlcm4iLCJwYXR0ZXJuIiwicmVzdWx0IiwiX2RlY29kZSIsInJldmVyc2UiLCJkaXJlY3Rpb24iLCJESVJFQ1RJT04iLCJSRVZFUlNFIiwiRk9SV0FSRCIsImZvcm1hdCIsIkZPUk1BVCIsIl9tYXRjaFJhbmdlIiwidmFsdWUiLCJfZmlsbENvdW50ZXJzIiwiY291bnRlcnMiLCJfdG9Db3VudGVycyIsIm51bUNvdW50ZXJzIiwiQXJyYXlIZWxwZXIiLCJpbml0IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0ZWFibGUiLCJFeGNlcHRpb24iLCJTdGFydE5vdEZvdW5kRXhjZXB0aW9uIiwiQ29kZU5vdEZvdW5kRXhjZXB0aW9uIiwiUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uIiwiQ09ORklHX0tFWVMiLCJhcnIiLCJ2YWwiLCJsIiwic2h1ZmZsZSIsImoiLCJ4IiwiZmxvb3IiLCJyYW5kb20iLCJ0b1BvaW50TGlzdCIsInJvdyIsInJvd3MiLCJqb2luIiwidGhyZXNob2xkIiwic2NvcmVGdW5jIiwicXVldWUiLCJhcHBseSIsIm1heEluZGV4IiwibWF4IiwiRUFOUmVhZGVyIiwib3B0cyIsImdldERlZmF1bENvbmZpZyIsImNhbGwiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImRlZmF1bHQiLCJwcm9wZXJ0aWVzIiwiQ09ERV9MX1NUQVJUIiwiQ09ERV9HX1NUQVJUIiwiU1RBUlRfUEFUVEVSTiIsIlNUT1BfUEFUVEVSTiIsIk1JRERMRV9QQVRURVJOIiwiRVhURU5TSU9OX1NUQVJUX1BBVFRFUk4iLCJDT0RFX1BBVFRFUk4iLCJDT0RFX0ZSRVFVRU5DWSIsIkFWR19DT0RFX0VSUk9SIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJfZGVjb2RlQ29kZSIsImNvZGVyYW5nZSIsIl9maW5kUGF0dGVybiIsInRyeUhhcmRlciIsIl9maW5kU3RhcnQiLCJsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0Iiwic3RhcnRJbmZvIiwiX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSIsImVuZEluZm8iLCJ0cmFpbGluZ1doaXRlc3BhY2VFbmQiLCJfZmluZEVuZCIsIl9jYWxjdWxhdGVGaXJzdERpZ2l0IiwiY29kZUZyZXF1ZW5jeSIsIl9kZWNvZGVQYXlsb2FkIiwiZGVjb2RlZENvZGVzIiwiZmlyc3REaWdpdCIsInVuc2hpZnQiLCJyZXN1bHRJbmZvIiwiX2NoZWNrc3VtIiwiZXh0IiwiX2RlY29kZUV4dGVuc2lvbnMiLCJsYXN0Q29kZSIsInN1cHBsZW1lbnQiLCJjb2Rlc2V0IiwiZGVjb2RlIiwiZHJhd1JlY3QiLCJwb3MiLCJzaXplIiwiY3R4Iiwic3R5bGUiLCJzdHJva2VTdHlsZSIsImNvbG9yIiwiZmlsbFN0eWxlIiwibGluZVdpZHRoIiwiYmVnaW5QYXRoIiwic3Ryb2tlUmVjdCIsInkiLCJkcmF3UGF0aCIsInBhdGgiLCJkZWYiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJkcmF3SW1hZ2UiLCJpbWFnZURhdGEiLCJjYW52YXNEYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiZGF0YSIsImltYWdlRGF0YVBvcyIsImNhbnZhc0RhdGFQb3MiLCJwdXRJbWFnZURhdGEiLCJ2ZWMyIiwiY2xvbmUiLCJyZXF1aXJlIiwidmVjMyIsImltYWdlUmVmIiwidGhhdCIsInRvVmVjMiIsInRvVmVjMyIsInJvdW5kIiwiY29tcHV0ZUludGVncmFsSW1hZ2UyIiwiaW1hZ2VXcmFwcGVyIiwiaW50ZWdyYWxXcmFwcGVyIiwid2lkdGgiLCJoZWlnaHQiLCJpbnRlZ3JhbEltYWdlRGF0YSIsInBvc0EiLCJwb3NCIiwicG9zQyIsInBvc0QiLCJjb21wdXRlSW50ZWdyYWxJbWFnZSIsInYiLCJ1IiwidGhyZXNob2xkSW1hZ2UiLCJ0YXJnZXRXcmFwcGVyIiwidGFyZ2V0RGF0YSIsImNvbXB1dGVIaXN0b2dyYW0iLCJiaXRzUGVyUGl4ZWwiLCJiaXRTaGlmdCIsImJ1Y2tldENudCIsImhpc3QiLCJJbnQzMkFycmF5Iiwic2hhcnBlbkxpbmUiLCJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJkZXRlcm1pbmVPdHN1VGhyZXNob2xkIiwicHgiLCJteCIsImRldGVybWluZVRocmVzaG9sZCIsInZldCIsInAxIiwicDIiLCJwMTIiLCJrIiwibTEiLCJtMiIsIm0xMiIsIm90c3VUaHJlc2hvbGQiLCJjb21wdXRlQmluYXJ5SW1hZ2UiLCJrZXJuZWwiLCJBIiwiQiIsIkMiLCJEIiwiYXZnIiwiY2x1c3RlciIsInBvaW50cyIsInByb3BlcnR5IiwicG9pbnQiLCJjbHVzdGVycyIsImFkZFRvQ2x1c3RlciIsIm5ld1BvaW50IiwiZm91bmQiLCJmaXRzIiwiYWRkIiwiQ2x1c3RlcjIiLCJjcmVhdGVQb2ludCIsIlRyYWNlciIsInRyYWNlIiwidmVjIiwiaXRlcmF0aW9uIiwibWF4SXRlcmF0aW9ucyIsInRvcCIsImNlbnRlclBvcyIsImN1cnJlbnRQb3MiLCJpZHgiLCJmb3J3YXJkIiwiZnJvbSIsInRvIiwidG9JZHgiLCJwcmVkaWN0ZWRQb3MiLCJ0aHJlc2hvbGRYIiwidGhyZXNob2xkWSIsIm1hdGNoIiwicHJlZGljdGVkIiwiRElMQVRFIiwiRVJPREUiLCJkaWxhdGUiLCJpbkltYWdlV3JhcHBlciIsIm91dEltYWdlV3JhcHBlciIsImluSW1hZ2VEYXRhIiwib3V0SW1hZ2VEYXRhIiwieVN0YXJ0MSIsInlTdGFydDIiLCJ4U3RhcnQxIiwieFN0YXJ0MiIsImVyb2RlIiwic3VidHJhY3QiLCJhSW1hZ2VXcmFwcGVyIiwiYkltYWdlV3JhcHBlciIsInJlc3VsdEltYWdlV3JhcHBlciIsImFJbWFnZURhdGEiLCJiSW1hZ2VEYXRhIiwiY0ltYWdlRGF0YSIsImJpdHdpc2VPciIsImNvdW50Tm9uWmVybyIsInRvcEdlbmVyaWMiLCJsaXN0IiwibWluSWR4IiwibWluIiwic2NvcmUiLCJoaXQiLCJpdGVtIiwiZ3JheUFycmF5RnJvbUltYWdlIiwiaHRtbEltYWdlIiwib2Zmc2V0WCIsImFycmF5IiwiY3R4RGF0YSIsImNvbXB1dGVHcmF5IiwiZ3JheUFycmF5RnJvbUNvbnRleHQiLCJncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhIiwib3V0QXJyYXkiLCJ0b3BSb3dJZHgiLCJib3R0b21Sb3dJZHgiLCJlbmRJZHgiLCJvdXRXaWR0aCIsIm91dEltZ0lkeCIsImluV2lkdGgiLCJzaW5nbGVDaGFubmVsIiwibG9hZEltYWdlQXJyYXkiLCJzcmMiLCJjYWxsYmFjayIsImNhbnZhcyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImltZyIsIkltYWdlIiwib25sb2FkIiwiZ2V0Q29udGV4dCIsIlVpbnQ4QXJyYXkiLCJoYWxmU2FtcGxlIiwiaW5JbWdXcmFwcGVyIiwib3V0SW1nV3JhcHBlciIsImluSW1nIiwib3V0SW1nIiwiaHN2MnJnYiIsImhzdiIsInJnYiIsImgiLCJzIiwiYyIsIm0iLCJyIiwiZyIsImIiLCJfY29tcHV0ZURpdmlzb3JzIiwibiIsImxhcmdlRGl2aXNvcnMiLCJkaXZpc29ycyIsInNxcnQiLCJjb25jYXQiLCJfY29tcHV0ZUludGVyc2VjdGlvbiIsImFycjEiLCJhcnIyIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwicGF0Y2hTaXplIiwiaW1nU2l6ZSIsImRpdmlzb3JzWCIsImRpdmlzb3JzWSIsIndpZGVTaWRlIiwiY29tbW9uIiwibnJPZlBhdGNoZXNMaXN0IiwibnJPZlBhdGNoZXNNYXAiLCJuck9mUGF0Y2hlc0lkeCIsIm1lZGl1bSIsIm5yT2ZQYXRjaGVzIiwiZGVzaXJlZFBhdGNoU2l6ZSIsIm9wdGltYWxQYXRjaFNpemUiLCJmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMiLCJfcGFyc2VDU1NEaW1lbnNpb25WYWx1ZXMiLCJkaW1lbnNpb24iLCJwYXJzZUZsb2F0IiwidW5pdCIsImluZGV4T2YiLCJfZGltZW5zaW9uc0NvbnZlcnRlcnMiLCJjb250ZXh0IiwiYm90dG9tIiwiY29tcHV0ZUltYWdlQXJlYSIsImlucHV0V2lkdGgiLCJpbnB1dEhlaWdodCIsImFyZWEiLCJwYXJzZWRBcmVhIiwicmVkdWNlIiwicGFyc2VkIiwiY2FsY3VsYXRlZCIsInN4Iiwic3kiLCJzdyIsInNoIiwiSW1hZ2VXcmFwcGVyIiwiQXJyYXlUeXBlIiwiaW5pdGlhbGl6ZSIsIkFycmF5IiwiaW5JbWFnZVdpdGhCb3JkZXIiLCJpbWdSZWYiLCJib3JkZXIiLCJzYW1wbGUiLCJseCIsImx5IiwidyIsImJhc2UiLCJhIiwiZCIsImUiLCJjbGVhckFycmF5Iiwic3ViSW1hZ2UiLCJzdWJJbWFnZUFzQ29weSIsInNpemVZIiwic2l6ZVgiLCJjb3B5VG8iLCJzcmNEYXRhIiwiZHN0RGF0YSIsImdldCIsImdldFNhZmUiLCJpbmRleE1hcHBpbmciLCJzZXQiLCJ6ZXJvQm9yZGVyIiwiaW52ZXJ0IiwiY29udm9sdmUiLCJreCIsImt5Iiwia1NpemUiLCJhY2N1IiwibW9tZW50cyIsImxhYmVsY291bnQiLCJ5c3EiLCJsYWJlbHN1bSIsImxhYmVsIiwibXUxMSIsIm11MDIiLCJtdTIwIiwieF8iLCJ5XyIsIlBJIiwiUElfNCIsIm0wMCIsIm0wMSIsIm0xMCIsIm0xMSIsIm0wMiIsIm0yMCIsInRoZXRhIiwicmFkIiwiaXNOYU4iLCJhdGFuIiwiY29zIiwic2luIiwic2hvdyIsInNjYWxlIiwiZnJhbWUiLCJjdXJyZW50IiwicGl4ZWwiLCJvdmVybGF5Iiwid2hpdGVSZ2IiLCJibGFja1JnYiIsInNlYXJjaERpcmVjdGlvbnMiLCJsYWJlbFdyYXBwZXIiLCJsYWJlbERhdGEiLCJlZGdlbGFiZWwiLCJjeSIsImRpciIsImN4IiwidmVydGV4MkQiLCJuZXh0IiwicHJldiIsImNvbnRvdXJUcmFjaW5nIiwiRnYiLCJDdiIsIlAiLCJsZGlyIiwiQ29kZTM5UmVhZGVyIiwiQUxQSEFCRVRIX1NUUklORyIsIkFMUEhBQkVUIiwiQ0hBUkFDVEVSX0VOQ09ESU5HUyIsIkFTVEVSSVNLIiwiZGVjb2RlZENoYXIiLCJsYXN0U3RhcnQiLCJuZXh0U3RhcnQiLCJfdG9QYXR0ZXJuIiwiX3BhdHRlcm5Ub0NoYXIiLCJwb3AiLCJwYXR0ZXJuU2l6ZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIl9maW5kTmV4dFdpZHRoIiwibWluV2lkdGgiLCJtYXhOYXJyb3dXaWR0aCIsIm51bVdpZGVCYXJzIiwid2lkZUJhcldpZHRoIiwicGF0dGVyblN0YXJ0Iiwid2hpdGVTcGFjZU11c3RTdGFydCIsIl9pbnB1dFN0cmVhbSIsIl9mcmFtZWdyYWJiZXIiLCJfc3RvcHBlZCIsIl9jYW52YXNDb250YWluZXIiLCJpbWFnZSIsImRvbSIsIl9pbnB1dEltYWdlV3JhcHBlciIsIl9ib3hTaXplIiwiX2RlY29kZXIiLCJfd29ya2VyUG9vbCIsIl9vblVJVGhyZWFkIiwiX3Jlc3VsdENvbGxlY3RvciIsIl9jb25maWciLCJpbml0aWFsaXplRGF0YSIsImluaXRCdWZmZXJzIiwiQmFyY29kZURlY29kZXIiLCJkZWNvZGVyIiwiaW5pdElucHV0U3RyZWFtIiwiY2IiLCJ2aWRlbyIsImlucHV0U3RyZWFtIiwidHlwZSIsIklucHV0U3RyZWFtIiwiY3JlYXRlVmlkZW9TdHJlYW0iLCJjcmVhdGVJbWFnZVN0cmVhbSIsIiR2aWV3cG9ydCIsImdldFZpZXdQb3J0IiwicXVlcnlTZWxlY3RvciIsImFwcGVuZENoaWxkIiwiY3JlYXRlTGl2ZVN0cmVhbSIsIkNhbWVyYUFjY2VzcyIsInJlcXVlc3QiLCJjb25zdHJhaW50cyIsInRoZW4iLCJ0cmlnZ2VyIiwiY2F0Y2giLCJlcnIiLCJzZXRBdHRyaWJ1dGUiLCJzZXRJbnB1dFN0cmVhbSIsImFkZEV2ZW50TGlzdGVuZXIiLCJjYW5SZWNvcmQiLCJiaW5kIiwidGFyZ2V0Iiwibm9kZU5hbWUiLCJub2RlVHlwZSIsInNlbGVjdG9yIiwiQmFyY29kZUxvY2F0b3IiLCJjaGVja0ltYWdlQ29uc3RyYWludHMiLCJsb2NhdG9yIiwiaW5pdENhbnZhcyIsIkZyYW1lR3JhYmJlciIsImFkanVzdFdvcmtlclBvb2wiLCJudW1PZldvcmtlcnMiLCJyZWFkeSIsInBsYXkiLCJjbGFzc05hbWUiLCJnZXRDYW52YXNTaXplIiwiY2xlYXJGaXgiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsImNvbnNvbGUiLCJsb2ciLCJnZXRCb3VuZGluZ0JveGVzIiwibG9jYXRlIiwidHJhbnNmb3JtUmVzdWx0IiwidG9wUmlnaHQiLCJnZXRUb3BSaWdodCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiYmFyY29kZXMiLCJtb3ZlTGluZSIsImJveCIsIm1vdmVCb3giLCJib3hlcyIsImNvcm5lciIsImFkZFJlc3VsdCIsImZpbHRlciIsImJhcmNvZGUiLCJjb2RlUmVzdWx0IiwiaGFzQ29kZVJlc3VsdCIsInNvbWUiLCJwdWJsaXNoUmVzdWx0IiwicmVzdWx0VG9QdWJsaXNoIiwiRXZlbnRzIiwicHVibGlzaCIsImxvY2F0ZUFuZERlY29kZSIsImRlY29kZUZyb21Cb3VuZGluZ0JveGVzIiwidXBkYXRlIiwiYXZhaWxhYmxlV29ya2VyIiwid29ya2VyVGhyZWFkIiwiYnVzeSIsImF0dGFjaERhdGEiLCJncmFiIiwid29ya2VyIiwicG9zdE1lc3NhZ2UiLCJjbWQiLCJidWZmZXIiLCJzdGFydENvbnRpbnVvdXNVcGRhdGUiLCJkZWxheSIsImZyZXF1ZW5jeSIsInRpbWVzdGFtcCIsIndpbmRvdyIsInJlcXVlc3RBbmltRnJhbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsImluaXRXb3JrZXIiLCJibG9iVVJMIiwiZ2VuZXJhdGVXb3JrZXJCbG9iIiwiV29ya2VyIiwib25tZXNzYWdlIiwiZXZlbnQiLCJVUkwiLCJyZXZva2VPYmplY3RVUkwiLCJtZXNzYWdlIiwiY29uZmlnRm9yV29ya2VyIiwid29ya2VySW50ZXJmYWNlIiwiZmFjdG9yeSIsIlF1YWdnYSIsIm9uUHJvY2Vzc2VkIiwic2V0UmVhZGVycyIsInJlYWRlcnMiLCJibG9iIiwiZmFjdG9yeVNvdXJjZSIsIl9fZmFjdG9yeVNvdXJjZV9fIiwiQmxvYiIsInRvU3RyaW5nIiwiY3JlYXRlT2JqZWN0VVJMIiwiY2FwYWNpdHkiLCJpbmNyZWFzZUJ5Iiwid29ya2Vyc1RvVGVybWluYXRlIiwic2xpY2UiLCJ0ZXJtaW5hdGUiLCJ3b3JrZXJJbml0aWFsaXplZCIsInN0b3AiLCJyZWxlYXNlIiwiY2xlYXJFdmVudEhhbmRsZXJzIiwicGF1c2UiLCJvbkRldGVjdGVkIiwic3Vic2NyaWJlIiwib2ZmRGV0ZWN0ZWQiLCJ1bnN1YnNjcmliZSIsIm9mZlByb2Nlc3NlZCIsInJlZ2lzdGVyUmVzdWx0Q29sbGVjdG9yIiwicmVzdWx0Q29sbGVjdG9yIiwiZGVjb2RlU2luZ2xlIiwicmVzdWx0Q2FsbGJhY2siLCJzZXF1ZW5jZSIsImRlYnVnIiwib25jZSIsIkltYWdlRGVidWciLCJSZXN1bHRDb2xsZWN0b3IiLCJjb250YWlucyIsImV2ZXJ5IiwicGFzc2VzRmlsdGVyIiwicmVzdWx0cyIsImNhcHR1cmUiLCJtYXRjaGVzQ29uc3RyYWludHMiLCJibGFja2xpc3QiLCJpbWFnZVNpemUiLCJ0b0RhdGFVUkwiLCJnZXRSZXN1bHRzIiwiZG90IiwicG9pbnRNYXAiLCJ1cGRhdGVDZW50ZXIiLCJwb2ludFRvQWRkIiwiaWQiLCJvdGhlclBvaW50Iiwic2ltaWxhcml0eSIsImdldFBvaW50cyIsImdldENlbnRlciIsImV2ZW50cyIsImdldEV2ZW50IiwiZXZlbnROYW1lIiwic3Vic2NyaWJlcnMiLCJjbGVhckV2ZW50cyIsInB1Ymxpc2hTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb24iLCJhc3luYyIsInNldFRpbWVvdXQiLCJzdWJzY3JpYmVyIiwiZW51bWVyYXRlRGV2aWNlcyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsIlByb21pc2UiLCJyZWplY3QiLCJFcnJvciIsImdldFVzZXJNZWRpYSIsIlN1YkltYWdlIiwiSSIsIm9yaWdpbmFsU2l6ZSIsInVwZGF0ZURhdGEiLCJ1cGRhdGVGcm9tIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwid2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwib1JlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiaW11bCIsImFoIiwiYWwiLCJiaCIsImJsIiwiYXNzaWduIiwiVHlwZUVycm9yIiwiaW5kZXgiLCJhcmd1bWVudHMiLCJuZXh0U291cmNlIiwibmV4dEtleSIsImhhc093blByb3BlcnR5IiwibW9kdWxlIiwiZXhwb3J0cyIsIm5hbWUiLCJmYWNpbmdNb2RlIiwiZHJhd0JvdW5kaW5nQm94Iiwic2hvd0ZyZXF1ZW5jeSIsImRyYXdTY2FubGluZSIsInNob3dQYXR0ZXJuIiwic2hvd0NhbnZhcyIsInNob3dQYXRjaGVzIiwic2hvd0ZvdW5kUGF0Y2hlcyIsInNob3dTa2VsZXRvbiIsInNob3dMYWJlbHMiLCJzaG93UGF0Y2hMYWJlbHMiLCJzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMiLCJib3hGcm9tUGF0Y2hlcyIsInNob3dUcmFuc2Zvcm1lZCIsInNob3dUcmFuc2Zvcm1lZEJveCIsInNob3dCQiIsIkVOViIsIm5vZGUiLCJSRUFERVJTIiwiY29kZV8xMjhfcmVhZGVyIiwiZWFuX3JlYWRlciIsImVhbl81X3JlYWRlciIsImVhbl8yX3JlYWRlciIsImVhbl84X3JlYWRlciIsImNvZGVfMzlfcmVhZGVyIiwiY29kZV8zOV92aW5fcmVhZGVyIiwiY29kYWJhcl9yZWFkZXIiLCJ1cGNfcmVhZGVyIiwidXBjX2VfcmVhZGVyIiwiaTJvZjVfcmVhZGVyIiwiY29kZV85M19yZWFkZXIiLCJDb2RlOTNSZWFkZXIiLCJpbnB1dEltYWdlV3JhcHBlciIsIl9jYW52YXMiLCJfYmFyY29kZVJlYWRlcnMiLCJpbml0UmVhZGVycyIsImluaXRDb25maWciLCIkZGVidWciLCJyZWFkZXJDb25maWciLCJyZWFkZXIiLCJjb25maWd1cmF0aW9uIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsInZpcyIsInByb3AiLCJkaXNwbGF5IiwiZ2V0RXh0ZW5kZWRMaW5lIiwiYW5nbGUiLCJleHRlbmRMaW5lIiwiYW1vdW50IiwiZXh0ZW5zaW9uIiwiY2VpbCIsImdldExpbmUiLCJ0cnlEZWNvZGUiLCJiYXJjb2RlTGluZSIsIkJyZXNlbmhhbSIsImdldEJhcmNvZGVMaW5lIiwicHJpbnRGcmVxdWVuY3kiLCJ0b0JpbmFyeUxpbmUiLCJwcmludFBhdHRlcm4iLCJ0cnlEZWNvZGVCcnV0ZUZvcmNlIiwibGluZUFuZ2xlIiwic2lkZUxlbmd0aCIsInBvdyIsInNsaWNlcyIsInhkaXIiLCJ5ZGlyIiwiZ2V0TGluZUxlbmd0aCIsImRlY29kZUZyb21Cb3VuZGluZ0JveCIsImxpbmVMZW5ndGgiLCJhdGFuMiIsIm11bHRpcGxlIiwiU2xvcGUiLCJESVIiLCJVUCIsIkRPV04iLCJ4MCIsInkwIiwieDEiLCJ5MSIsInN0ZWVwIiwiZGVsdGF4IiwiZGVsdGF5IiwieXN0ZXAiLCJyZWFkIiwic2xvcGUiLCJzbG9wZTIiLCJleHRyZW1hIiwiY3VycmVudERpciIsInJUaHJlc2hvbGQiLCJmaWxsQ29sb3IiLCJmaWxsUmVjdCIsImZhY2luZ01hdGNoaW5nIiwic3RyZWFtUmVmIiwid2FpdEZvclZpZGVvIiwicmVzb2x2ZSIsImF0dGVtcHRzIiwiY2hlY2tWaWRlbyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImluaXRDYW1lcmEiLCJzdHJlYW0iLCJzcmNPYmplY3QiLCJkZXByZWNhdGVkQ29uc3RyYWludHMiLCJ2aWRlb0NvbnN0cmFpbnRzIiwibm9ybWFsaXplZCIsIm1pbkFzcGVjdFJhdGlvIiwiYXNwZWN0UmF0aW8iLCJmYWNpbmciLCJwaWNrQ29uc3RyYWludHMiLCJub3JtYWxpemVkQ29uc3RyYWludHMiLCJhdWRpbyIsImRldmljZUlkIiwiZW51bWVyYXRlVmlkZW9EZXZpY2VzIiwiZGV2aWNlcyIsImRldmljZSIsImtpbmQiLCJnZXRBY3RpdmVUcmFjayIsInRyYWNrcyIsImdldFZpZGVvVHJhY2tzIiwiZ2V0QWN0aXZlU3RyZWFtTGFiZWwiLCJ0cmFjayIsIkV4aWZUYWdzIiwiQXZhaWxhYmxlVGFncyIsImZpbmRUYWdzSW5PYmplY3RVUkwiLCJ0YWdzIiwidGVzdCIsIm9iamVjdFVSTFRvQmxvYiIsInJlYWRUb0J1ZmZlciIsImZpbmRUYWdzSW5CdWZmZXIiLCJiYXNlNjRUb0FycmF5QnVmZmVyIiwiZGF0YVVybCIsImJhc2U2NCIsInJlcGxhY2UiLCJiaW5hcnkiLCJhdG9iIiwibGVuIiwiQXJyYXlCdWZmZXIiLCJ2aWV3IiwiY2hhckNvZGVBdCIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJ1cmwiLCJodHRwIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwicmVzcG9uc2VUeXBlIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJzdGF0dXMiLCJyZXNwb25zZSIsIm9uZXJyb3IiLCJzZW5kIiwiZmlsZSIsInNlbGVjdGVkVGFncyIsImRhdGFWaWV3IiwiRGF0YVZpZXciLCJieXRlTGVuZ3RoIiwiZXhpZlRhZ3MiLCJzZWxlY3RlZFRhZyIsImV4aWZUYWciLCJ0YWciLCJtYXJrZXIiLCJnZXRVaW50OCIsInJlYWRFWElGRGF0YSIsImdldFVpbnQxNiIsImdldFN0cmluZ0Zyb21CdWZmZXIiLCJ0aWZmT2Zmc2V0IiwiYmlnRW5kIiwiZmlyc3RJRkRPZmZzZXQiLCJnZXRVaW50MzIiLCJyZWFkVGFncyIsInRpZmZTdGFydCIsImRpclN0YXJ0Iiwic3RyaW5ncyIsImVudHJpZXMiLCJlbnRyeU9mZnNldCIsInJlYWRUYWdWYWx1ZSIsIm51bVZhbHVlcyIsIm91dHN0ciIsIlRPX1JBRElBTlMiLCJhZGp1c3RDYW52YXNTaXplIiwidGFyZ2V0U2l6ZSIsIl90aGF0IiwiX3N0cmVhbUNvbmZpZyIsImdldENvbmZpZyIsIl92aWRlb19zaXplIiwiZ2V0UmVhbFdpZHRoIiwiZ2V0UmVhbEhlaWdodCIsIl9jYW52YXNTaXplIiwiX3NpemUiLCJfc3giLCJfc3kiLCJfY3R4IiwiX2RhdGEiLCJ2aWRlb1NpemUiLCJjYW52YXNTaXplIiwiZ2V0RGF0YSIsImRvSGFsZlNhbXBsZSIsImdldEZyYW1lIiwiZHJhd2FibGUiLCJkcmF3QW5nbGUiLCJvcmllbnRhdGlvbiIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsImdldFNpemUiLCJJbWFnZUxvYWRlciIsImxvYWQiLCJkaXJlY3RvcnkiLCJodG1sSW1hZ2VzU3JjQXJyYXkiLCJodG1sSW1hZ2VzQXJyYXkiLCJudW0iLCJub3RMb2FkZWQiLCJhZGRJbWFnZSIsImxvYWRlZCIsImxvYWRlZEltZyIsIm5vdGxvYWRlZEltZ3MiLCJzcGxpY2UiLCJpbWdOYW1lIiwic3Vic3RyIiwibGFzdEluZGV4T2YiLCJhZGRPbmxvYWRIYW5kbGVyIiwiX2V2ZW50TmFtZXMiLCJfZXZlbnRIYW5kbGVycyIsIl9jYWxjdWxhdGVkV2lkdGgiLCJfY2FsY3VsYXRlZEhlaWdodCIsIl90b3BSaWdodCIsImluaXRTaXplIiwic2V0V2lkdGgiLCJzZXRIZWlnaHQiLCJlbmRlZCIsInNldEN1cnJlbnRUaW1lIiwidGltZSIsImN1cnJlbnRUaW1lIiwiZiIsImJvb2wiLCJoYW5kbGVycyIsImhhbmRsZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYXJncyIsInNldFRvcFJpZ2h0Iiwic2V0Q2FudmFzU2l6ZSIsImZyYW1lSWR4IiwicGF1c2VkIiwiaW1nQXJyYXkiLCJiYXNlVXJsIiwiY2FsY3VsYXRlZFdpZHRoIiwiY2FsY3VsYXRlZEhlaWdodCIsImxvYWRJbWFnZXMiLCJpbWdzIiwicHVibGlzaEV2ZW50IiwibmV3V2lkdGgiLCJuZXdIZWlnaHQiLCJ0cmFuc2Zvcm1NYXQyIiwibWF0MiIsImNvcHkiLCJfY3VycmVudEltYWdlV3JhcHBlciIsIl9za2VsSW1hZ2VXcmFwcGVyIiwiX3N1YkltYWdlV3JhcHBlciIsIl9sYWJlbEltYWdlV3JhcHBlciIsIl9wYXRjaEdyaWQiLCJfcGF0Y2hMYWJlbEdyaWQiLCJfaW1hZ2VUb1BhdGNoR3JpZCIsIl9iaW5hcnlJbWFnZVdyYXBwZXIiLCJfcGF0Y2hTaXplIiwiX251bVBhdGNoZXMiLCJfc2tlbGV0b25pemVyIiwic2tlbGV0b25JbWFnZURhdGEiLCJza2VsZXRvbml6ZXIiLCJnbG9iYWwiLCJ1c2VXb3JrZXIiLCJwYXRjaGVzIiwib3ZlckF2ZyIsInBhdGNoIiwidHJhbnNNYXQiLCJtaW54IiwibWlueSIsIm1heHgiLCJtYXh5IiwiYmluYXJpemVJbWFnZSIsImZpbmRQYXRjaGVzIiwicGF0Y2hlc0ZvdW5kIiwicmFzdGVyaXplciIsInJhc3RlclJlc3VsdCIsInNrZWxldG9uaXplIiwiUmFzdGVyaXplciIsInJhc3Rlcml6ZSIsImRlc2NyaWJlUGF0Y2giLCJmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzIiwibWF4TGFiZWwiLCJsYWJlbEhpc3QiLCJ0b3BMYWJlbHMiLCJzb3J0IiwiZWwiLCJmaW5kQm94ZXMiLCJzaW1pbGFyTW9tZW50cyIsInRvcENsdXN0ZXIiLCJwYXRjaFBvcyIsImVsaWdpYmxlTW9tZW50cyIsIm1hdGNoaW5nTW9tZW50cyIsIm1pbkNvbXBvbmVudFdlaWdodCIsInJhc3Rlcml6ZUFuZ3VsYXJTaW1pbGFyaXR5IiwiY3VycklkeCIsIm5vdFlldFByb2Nlc3NlZCIsImN1cnJlbnRJZHgiLCJjdXJyZW50UGF0Y2giLCJjcmVhdGVDb250b3VyMkQiLCJmaXJzdFZlcnRleCIsImluc2lkZUNvbnRvdXJzIiwibmV4dHBlZXIiLCJwcmV2cGVlciIsIkNPTlRPVVJfRElSIiwiQ1dfRElSIiwiQ0NXX0RJUiIsIlVOS05PV05fRElSIiwiT1VUU0lERV9FREdFIiwiSU5TSURFX0VER0UiLCJ0cmFjZXIiLCJkZXB0aGxhYmVsIiwiYmMiLCJsYyIsImxhYmVsaW5kZXgiLCJjb2xvck1hcCIsInZlcnRleCIsInAiLCJjYyIsInNjIiwiY29ubmVjdGVkQ291bnQiLCJkcmF3Q29udG91ciIsImZpcnN0Q29udG91ciIsInBxIiwiaXEiLCJxIiwiU2tlbGV0b25pemVyIiwic3RkbGliIiwiZm9yZWlnbiIsImltYWdlcyIsImluSW1hZ2VQdHIiLCJvdXRJbWFnZVB0ciIsImFJbWFnZVB0ciIsImJJbWFnZVB0ciIsImltYWdlUHRyIiwibWVtY3B5Iiwic3JjSW1hZ2VQdHIiLCJkc3RJbWFnZVB0ciIsInN1YkltYWdlUHRyIiwiZXJvZGVkSW1hZ2VQdHIiLCJ0ZW1wSW1hZ2VQdHIiLCJza2VsSW1hZ2VQdHIiLCJkb25lIiwiVHdvT2ZGaXZlUmVhZGVyIiwiYmFyU3BhY2VSYXRpbyIsIk4iLCJXIiwid3JpdGFibGUiLCJzdGFydFBhdHRlcm5MZW5ndGgiLCJuYXJyb3dCYXJXaWR0aCIsImNvdW50ZXJMZW5ndGgiLCJfdmVyaWZ5Q291bnRlckxlbmd0aCIsIkNvZGFiYXJSZWFkZXIiLCJfY291bnRlcnMiLCJTVEFSVF9FTkQiLCJNSU5fRU5DT0RFRF9DSEFSUyIsIk1BWF9BQ0NFUFRBQkxFIiwiUEFERElORyIsInN0YXJ0Q291bnRlciIsIl9pc1N0YXJ0RW5kIiwiX3ZlcmlmeVdoaXRlc3BhY2UiLCJfdmFsaWRhdGVSZXN1bHQiLCJfc3VtQ291bnRlcnMiLCJlbmRDb3VudGVyIiwiX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgiLCJfdGhyZXNob2xkUmVzdWx0UGF0dGVybiIsImNhdGVnb3JpemF0aW9uIiwic3BhY2UiLCJuYXJyb3ciLCJjb3VudHMiLCJ3aWRlIiwiYmFyIiwiY2F0IiwiX2NoYXJUb1BhdHRlcm4iLCJuZXdraW5kIiwiY2hhciIsImNoYXJDb2RlIiwidGhyZXNob2xkcyIsIl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQiLCJiYXJUaHJlc2hvbGQiLCJzcGFjZVRocmVzaG9sZCIsImJpdG1hc2siLCJDb2RlMTI4UmVhZGVyIiwiQ09ERV9TSElGVCIsIkNPREVfQyIsIkNPREVfQiIsIkNPREVfQSIsIlNUQVJUX0NPREVfQSIsIlNUQVJUX0NPREVfQiIsIlNUQVJUX0NPREVfQyIsIlNUT1BfQ09ERSIsIk1PRFVMRV9JTkRJQ0VTIiwiX2NvcnJlY3QiLCJjYWxjdWxhdGVDb3JyZWN0aW9uIiwibXVsdGlwbGllciIsImNoZWNrc3VtIiwicmF3UmVzdWx0Iiwic2hpZnROZXh0IiwicmVtb3ZlTGFzdENoYXJhY3RlciIsImV4cGVjdGVkIiwic3VtTm9ybWFsaXplZCIsInN1bUV4cGVjdGVkIiwiQ29kZTM5VklOUmVhZGVyIiwicGF0dGVybnMiLCJJT1EiLCJBWjA5IiwiX2NoZWNrQ2hlY2tzdW0iLCJzcGxpdCIsIl92ZXJpZnlFbmQiLCJfdmVyaWZ5Q2hlY2tzdW1zIiwiX2RlY29kZUV4dGVuZGVkIiwiY2hhckFycmF5IiwibmV4dENoYXIiLCJuZXh0Q2hhckNvZGUiLCJfbWF0Y2hDaGVja0NoYXIiLCJtYXhXZWlnaHQiLCJhcnJheVRvQ2hlY2siLCJ3ZWlnaHRlZFN1bXMiLCJ3ZWlnaHQiLCJjaGVja0NoYXIiLCJFQU4yUmVhZGVyIiwicGFyc2VJbnQiLCJFQU41UmVhZGVyIiwiQ0hFQ0tfRElHSVRfRU5DT0RJTkdTIiwiZXh0ZW5zaW9uQ2hlY2tzdW0iLCJkZXRlcm1pbmVDaGVja0RpZ2l0IiwiRUFOOFJlYWRlciIsIkkyb2Y1UmVhZGVyIiwibm9ybWFsaXplQmFyU3BhY2VXaWR0aCIsIk1BWF9DT1JSRUNUSU9OX0ZBQ1RPUiIsImNvdW50ZXJTdW0iLCJjb2RlU3VtIiwiY29ycmVjdGlvblJhdGlvIiwiY29ycmVjdGlvblJhdGlvSW52ZXJzZSIsIl9kZWNvZGVQYWlyIiwiY291bnRlclBhaXIiLCJjb2RlcyIsIlVQQ0VSZWFkZXIiLCJfZGV0ZXJtaW5lUGFyaXR5IiwibnJTeXN0ZW0iLCJfY29udmVydFRvVVBDQSIsInVwY2EiLCJsYXN0RGlnaXQiLCJVUENSZWFkZXIiLCJjaGFyQXQiLCJzdWJzdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNSQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDOUJBOztBQUVBLFNBQVNBLGFBQVQsQ0FBdUJDLE1BQXZCLEVBQStCQyxXQUEvQixFQUE0QztBQUN4QyxTQUFLQyxJQUFMLEdBQVksRUFBWjtBQUNBLFNBQUtGLE1BQUwsR0FBY0EsVUFBVSxFQUF4QjtBQUNBLFNBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0FBQ0EsV0FBTyxJQUFQO0FBQ0g7O0FBRURGLGNBQWNJLFNBQWQsQ0FBd0JDLFVBQXhCLEdBQXFDLFVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQjtBQUN2RCxRQUFJQyxDQUFKOztBQUVBLFFBQUlELFVBQVVFLFNBQWQsRUFBeUI7QUFDckJGLGdCQUFRLENBQVI7QUFDSDtBQUNELFNBQUtDLElBQUlELEtBQVQsRUFBZ0JDLElBQUlGLEtBQUtJLE1BQXpCLEVBQWlDRixHQUFqQyxFQUFzQztBQUNsQyxZQUFJLENBQUNGLEtBQUtFLENBQUwsQ0FBTCxFQUFjO0FBQ1YsbUJBQU9BLENBQVA7QUFDSDtBQUNKO0FBQ0QsV0FBT0YsS0FBS0ksTUFBWjtBQUNILENBWkQ7O0FBY0FWLGNBQWNJLFNBQWQsQ0FBd0JPLGFBQXhCLEdBQXdDLFVBQVNDLE9BQVQsRUFBa0JDLElBQWxCLEVBQXdCQyxjQUF4QixFQUF3QztBQUM1RSxRQUFJTixDQUFKO0FBQUEsUUFDSU8sUUFBUSxDQURaO0FBQUEsUUFFSUMsY0FBYyxDQUZsQjtBQUFBLFFBR0lDLE1BQU0sQ0FIVjtBQUFBLFFBSUlDLFNBQVMsQ0FKYjtBQUFBLFFBS0lDLFFBTEo7QUFBQSxRQU1JQyxLQU5KO0FBQUEsUUFPSUMsTUFQSjs7QUFTQVAscUJBQWlCQSxrQkFBa0IsS0FBS1EsaUJBQXZCLElBQTRDLENBQTdEOztBQUVBLFNBQUtkLElBQUksQ0FBVCxFQUFZQSxJQUFJSSxRQUFRRixNQUF4QixFQUFnQ0YsR0FBaEMsRUFBcUM7QUFDakNTLGVBQU9MLFFBQVFKLENBQVIsQ0FBUDtBQUNBVSxrQkFBVUwsS0FBS0wsQ0FBTCxDQUFWO0FBQ0g7QUFDRCxRQUFJUyxNQUFNQyxNQUFWLEVBQWtCO0FBQ2QsZUFBT0ssT0FBT0MsU0FBZDtBQUNIO0FBQ0RMLGVBQVdGLE1BQU1DLE1BQWpCO0FBQ0FKLHNCQUFrQkssUUFBbEI7O0FBRUEsU0FBS1gsSUFBSSxDQUFULEVBQVlBLElBQUlJLFFBQVFGLE1BQXhCLEVBQWdDRixHQUFoQyxFQUFxQztBQUNqQ1ksZ0JBQVFSLFFBQVFKLENBQVIsQ0FBUjtBQUNBYSxpQkFBU1IsS0FBS0wsQ0FBTCxJQUFVVyxRQUFuQjtBQUNBSCxzQkFBY1MsS0FBS0MsR0FBTCxDQUFTTixRQUFRQyxNQUFqQixJQUEyQkEsTUFBekM7QUFDQSxZQUFJTCxjQUFjRixjQUFsQixFQUFrQztBQUM5QixtQkFBT1MsT0FBT0MsU0FBZDtBQUNIO0FBQ0RULGlCQUFTQyxXQUFUO0FBQ0g7QUFDRCxXQUFPRCxRQUFRRyxNQUFmO0FBQ0gsQ0FoQ0Q7O0FBa0NBbEIsY0FBY0ksU0FBZCxDQUF3QnVCLFFBQXhCLEdBQW1DLFVBQVNyQixJQUFULEVBQWVzQixNQUFmLEVBQXVCO0FBQ3RELFFBQUlwQixDQUFKOztBQUVBb0IsYUFBU0EsVUFBVSxDQUFuQjtBQUNBLFNBQUtwQixJQUFJb0IsTUFBVCxFQUFpQnBCLElBQUlGLEtBQUtJLE1BQTFCLEVBQWtDRixHQUFsQyxFQUF1QztBQUNuQyxZQUFJRixLQUFLRSxDQUFMLENBQUosRUFBYTtBQUNULG1CQUFPQSxDQUFQO0FBQ0g7QUFDSjtBQUNELFdBQU9GLEtBQUtJLE1BQVo7QUFDSCxDQVZEOztBQVlBVixjQUFjSSxTQUFkLENBQXdCeUIsWUFBeEIsR0FBdUMsVUFBU2pCLE9BQVQsRUFBa0JrQixVQUFsQixFQUE4QkMsT0FBOUIsRUFBdUM7QUFDMUUsUUFBSXJCLFNBQVNxQixRQUFRckIsTUFBckI7QUFBQSxRQUNJc0IsTUFBTSxDQURWO0FBRUEsV0FBTXRCLFFBQU4sRUFBZ0I7QUFDWnNCLGNBQU1wQixRQUFRbUIsUUFBUXJCLE1BQVIsQ0FBUixLQUE0QixJQUFLLENBQUMsSUFBSW9CLFVBQUwsSUFBbUIsQ0FBcEQsQ0FBTjtBQUNBLFlBQUlFLE1BQU0sQ0FBVixFQUFhO0FBQ1RwQixvQkFBUW1CLFFBQVFyQixNQUFSLENBQVIsSUFBMkJzQixHQUEzQjtBQUNIO0FBQ0o7QUFDSixDQVREOztBQVdBaEMsY0FBY0ksU0FBZCxDQUF3QjZCLFdBQXhCLEdBQXNDLFVBQVNDLFVBQVQsRUFBcUJDLE9BQXJCLEVBQThCO0FBQ2hFLFFBQUl2QixVQUFVLEVBQWQ7QUFBQSxRQUNJSixDQURKO0FBQUEsUUFFSTRCLE9BQU8sSUFGWDtBQUFBLFFBR0lSLFNBQVNRLEtBQUtULFFBQUwsQ0FBY1MsS0FBS2pDLElBQW5CLENBSGI7QUFBQSxRQUlJa0MsVUFBVSxDQUFDRCxLQUFLakMsSUFBTCxDQUFVeUIsTUFBVixDQUpmO0FBQUEsUUFLSVUsYUFBYSxDQUxqQjtBQUFBLFFBTUlDLFlBQVk7QUFDUnhCLGVBQU9RLE9BQU9DLFNBRE47QUFFUlgsY0FBTSxDQUFDLENBRkM7QUFHUk4sZUFBTztBQUhDLEtBTmhCO0FBQUEsUUFXSVEsS0FYSjs7QUFhQSxRQUFJbUIsVUFBSixFQUFnQjtBQUNaLGFBQU0xQixJQUFJLENBQVYsRUFBYUEsSUFBSTBCLFdBQVd4QixNQUE1QixFQUFvQ0YsR0FBcEMsRUFBeUM7QUFDckNJLG9CQUFRNEIsSUFBUixDQUFhLENBQWI7QUFDSDtBQUNELGFBQU1oQyxJQUFJb0IsTUFBVixFQUFrQnBCLElBQUk0QixLQUFLakMsSUFBTCxDQUFVTyxNQUFoQyxFQUF3Q0YsR0FBeEMsRUFBNkM7QUFDekMsZ0JBQUk0QixLQUFLakMsSUFBTCxDQUFVSyxDQUFWLElBQWU2QixPQUFuQixFQUE0QjtBQUN4QnpCLHdCQUFRMEIsVUFBUjtBQUNILGFBRkQsTUFFTztBQUNILG9CQUFJQSxlQUFlMUIsUUFBUUYsTUFBUixHQUFpQixDQUFwQyxFQUF1QztBQUNuQ0ssNEJBQVFxQixLQUFLekIsYUFBTCxDQUFtQkMsT0FBbkIsRUFBNEJzQixVQUE1QixDQUFSOztBQUVBLHdCQUFJbkIsUUFBUW9CLE9BQVosRUFBcUI7QUFDakJJLGtDQUFVaEMsS0FBVixHQUFrQkMsSUFBSW9CLE1BQXRCO0FBQ0FXLGtDQUFVRSxHQUFWLEdBQWdCakMsQ0FBaEI7QUFDQStCLGtDQUFVM0IsT0FBVixHQUFvQkEsT0FBcEI7QUFDQSwrQkFBTzJCLFNBQVA7QUFDSCxxQkFMRCxNQUtPO0FBQ0gsK0JBQU8sSUFBUDtBQUNIO0FBQ0osaUJBWEQsTUFXTztBQUNIRDtBQUNIO0FBQ0QxQix3QkFBUTBCLFVBQVIsSUFBc0IsQ0FBdEI7QUFDQUQsMEJBQVUsQ0FBQ0EsT0FBWDtBQUNIO0FBQ0o7QUFDSixLQTFCRCxNQTBCTztBQUNIekIsZ0JBQVE0QixJQUFSLENBQWEsQ0FBYjtBQUNBLGFBQU1oQyxJQUFJb0IsTUFBVixFQUFrQnBCLElBQUk0QixLQUFLakMsSUFBTCxDQUFVTyxNQUFoQyxFQUF3Q0YsR0FBeEMsRUFBNkM7QUFDekMsZ0JBQUk0QixLQUFLakMsSUFBTCxDQUFVSyxDQUFWLElBQWU2QixPQUFuQixFQUE0QjtBQUN4QnpCLHdCQUFRMEIsVUFBUjtBQUNILGFBRkQsTUFFTztBQUNIQTtBQUNBMUIsd0JBQVE0QixJQUFSLENBQWEsQ0FBYjtBQUNBNUIsd0JBQVEwQixVQUFSLElBQXNCLENBQXRCO0FBQ0FELDBCQUFVLENBQUNBLE9BQVg7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ7QUFDQUUsY0FBVWhDLEtBQVYsR0FBa0JxQixNQUFsQjtBQUNBVyxjQUFVRSxHQUFWLEdBQWdCTCxLQUFLakMsSUFBTCxDQUFVTyxNQUFWLEdBQW1CLENBQW5DO0FBQ0E2QixjQUFVM0IsT0FBVixHQUFvQkEsT0FBcEI7QUFDQSxXQUFPMkIsU0FBUDtBQUNILENBM0REOztBQTZEQXZDLGNBQWNJLFNBQWQsQ0FBd0JzQyxhQUF4QixHQUF3QyxVQUFTQyxPQUFULEVBQWtCO0FBQ3RELFFBQUlQLE9BQU8sSUFBWDtBQUFBLFFBQ0lRLE1BREo7O0FBR0FSLFNBQUtqQyxJQUFMLEdBQVl3QyxPQUFaO0FBQ0FDLGFBQVNSLEtBQUtTLE9BQUwsRUFBVDtBQUNBLFFBQUlELFdBQVcsSUFBZixFQUFxQjtBQUNqQlIsYUFBS2pDLElBQUwsQ0FBVTJDLE9BQVY7QUFDQUYsaUJBQVNSLEtBQUtTLE9BQUwsRUFBVDtBQUNBLFlBQUlELE1BQUosRUFBWTtBQUNSQSxtQkFBT0csU0FBUCxHQUFtQi9DLGNBQWNnRCxTQUFkLENBQXdCQyxPQUEzQztBQUNBTCxtQkFBT3JDLEtBQVAsR0FBZTZCLEtBQUtqQyxJQUFMLENBQVVPLE1BQVYsR0FBbUJrQyxPQUFPckMsS0FBekM7QUFDQXFDLG1CQUFPSCxHQUFQLEdBQWFMLEtBQUtqQyxJQUFMLENBQVVPLE1BQVYsR0FBbUJrQyxPQUFPSCxHQUF2QztBQUNIO0FBQ0osS0FSRCxNQVFPO0FBQ0hHLGVBQU9HLFNBQVAsR0FBbUIvQyxjQUFjZ0QsU0FBZCxDQUF3QkUsT0FBM0M7QUFDSDtBQUNELFFBQUlOLE1BQUosRUFBWTtBQUNSQSxlQUFPTyxNQUFQLEdBQWdCZixLQUFLZ0IsTUFBckI7QUFDSDtBQUNELFdBQU9SLE1BQVA7QUFDSCxDQXJCRDs7QUF1QkE1QyxjQUFjSSxTQUFkLENBQXdCaUQsV0FBeEIsR0FBc0MsVUFBUzlDLEtBQVQsRUFBZ0JrQyxHQUFoQixFQUFxQmEsS0FBckIsRUFBNEI7QUFDOUQsUUFBSTlDLENBQUo7O0FBRUFELFlBQVFBLFFBQVEsQ0FBUixHQUFZLENBQVosR0FBZ0JBLEtBQXhCO0FBQ0EsU0FBS0MsSUFBSUQsS0FBVCxFQUFnQkMsSUFBSWlDLEdBQXBCLEVBQXlCakMsR0FBekIsRUFBOEI7QUFDMUIsWUFBSSxLQUFLTCxJQUFMLENBQVVLLENBQVYsTUFBaUI4QyxLQUFyQixFQUE0QjtBQUN4QixtQkFBTyxLQUFQO0FBQ0g7QUFDSjtBQUNELFdBQU8sSUFBUDtBQUNILENBVkQ7O0FBWUF0RCxjQUFjSSxTQUFkLENBQXdCbUQsYUFBeEIsR0FBd0MsVUFBUzNCLE1BQVQsRUFBaUJhLEdBQWpCLEVBQXNCSixPQUF0QixFQUErQjtBQUNuRSxRQUFJRCxPQUFPLElBQVg7QUFBQSxRQUNJRSxhQUFhLENBRGpCO0FBQUEsUUFFSTlCLENBRko7QUFBQSxRQUdJZ0QsV0FBVyxFQUhmOztBQUtBbkIsY0FBVyxPQUFPQSxPQUFQLEtBQW1CLFdBQXBCLEdBQW1DQSxPQUFuQyxHQUE2QyxJQUF2RDtBQUNBVCxhQUFVLE9BQU9BLE1BQVAsS0FBa0IsV0FBbkIsR0FBa0NBLE1BQWxDLEdBQTJDUSxLQUFLL0IsVUFBTCxDQUFnQitCLEtBQUtqQyxJQUFyQixDQUFwRDtBQUNBc0MsVUFBTUEsT0FBT0wsS0FBS2pDLElBQUwsQ0FBVU8sTUFBdkI7O0FBRUE4QyxhQUFTbEIsVUFBVCxJQUF1QixDQUF2QjtBQUNBLFNBQUs5QixJQUFJb0IsTUFBVCxFQUFpQnBCLElBQUlpQyxHQUFyQixFQUEwQmpDLEdBQTFCLEVBQStCO0FBQzNCLFlBQUk0QixLQUFLakMsSUFBTCxDQUFVSyxDQUFWLElBQWU2QixPQUFuQixFQUE0QjtBQUN4Qm1CLHFCQUFTbEIsVUFBVDtBQUNILFNBRkQsTUFFTztBQUNIQTtBQUNBa0IscUJBQVNsQixVQUFULElBQXVCLENBQXZCO0FBQ0FELHNCQUFVLENBQUNBLE9BQVg7QUFDSDtBQUNKO0FBQ0QsV0FBT21CLFFBQVA7QUFDSCxDQXJCRDs7QUF1QkF4RCxjQUFjSSxTQUFkLENBQXdCcUQsV0FBeEIsR0FBc0MsVUFBU2xELEtBQVQsRUFBZ0JLLE9BQWhCLEVBQXlCO0FBQzNELFFBQUl3QixPQUFPLElBQVg7QUFBQSxRQUNJc0IsY0FBYzlDLFFBQVFGLE1BRDFCO0FBQUEsUUFFSStCLE1BQU1MLEtBQUtqQyxJQUFMLENBQVVPLE1BRnBCO0FBQUEsUUFHSTJCLFVBQVUsQ0FBQ0QsS0FBS2pDLElBQUwsQ0FBVUksS0FBVixDQUhmO0FBQUEsUUFJSUMsQ0FKSjtBQUFBLFFBS0k4QixhQUFhLENBTGpCOztBQU9BcUIsSUFBQSxxRUFBQUEsQ0FBWUMsSUFBWixDQUFpQmhELE9BQWpCLEVBQTBCLENBQTFCOztBQUVBLFNBQU1KLElBQUlELEtBQVYsRUFBaUJDLElBQUlpQyxHQUFyQixFQUEwQmpDLEdBQTFCLEVBQStCO0FBQzNCLFlBQUk0QixLQUFLakMsSUFBTCxDQUFVSyxDQUFWLElBQWU2QixPQUFuQixFQUE0QjtBQUN4QnpCLG9CQUFRMEIsVUFBUjtBQUNILFNBRkQsTUFFTztBQUNIQTtBQUNBLGdCQUFJQSxlQUFlb0IsV0FBbkIsRUFBZ0M7QUFDNUI7QUFDSCxhQUZELE1BRU87QUFDSDlDLHdCQUFRMEIsVUFBUixJQUFzQixDQUF0QjtBQUNBRCwwQkFBVSxDQUFDQSxPQUFYO0FBQ0g7QUFDSjtBQUNKOztBQUVELFdBQU96QixPQUFQO0FBQ0gsQ0F6QkQ7O0FBMkJBaUQsT0FBT0MsY0FBUCxDQUFzQjlELGNBQWNJLFNBQXBDLEVBQStDLFFBQS9DLEVBQXlEO0FBQ3JEa0QsV0FBTyxTQUQ4QztBQUVyRFMsZUFBVztBQUYwQyxDQUF6RDs7QUFLQS9ELGNBQWNnRCxTQUFkLEdBQTBCO0FBQ3RCRSxhQUFTLENBRGE7QUFFdEJELGFBQVMsQ0FBQztBQUZZLENBQTFCOztBQUtBakQsY0FBY2dFLFNBQWQsR0FBMEI7QUFDdEJDLDRCQUF3QiwyQkFERjtBQUV0QkMsMkJBQXVCLDBCQUZEO0FBR3RCQyw4QkFBMEI7QUFISixDQUExQjs7QUFNQW5FLGNBQWNvRSxXQUFkLEdBQTRCLEVBQTVCOztBQUVBLHdEQUFlcEUsYUFBZixDOzs7Ozs7QUNwUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7OztBQ3pCQSx3REFBZTtBQUNYNEQsVUFBTSxjQUFTUyxHQUFULEVBQWNDLEdBQWQsRUFBbUI7QUFDckIsWUFBSUMsSUFBSUYsSUFBSTNELE1BQVo7QUFDQSxlQUFPNkQsR0FBUCxFQUFZO0FBQ1JGLGdCQUFJRSxDQUFKLElBQVNELEdBQVQ7QUFDSDtBQUNKLEtBTlU7O0FBUVg7Ozs7QUFJQUUsYUFBUyxpQkFBU0gsR0FBVCxFQUFjO0FBQ25CLFlBQUk3RCxJQUFJNkQsSUFBSTNELE1BQUosR0FBYSxDQUFyQjtBQUFBLFlBQXdCK0QsQ0FBeEI7QUFBQSxZQUEyQkMsQ0FBM0I7QUFDQSxhQUFLbEUsQ0FBTCxFQUFRQSxLQUFLLENBQWIsRUFBZ0JBLEdBQWhCLEVBQXFCO0FBQ2pCaUUsZ0JBQUloRCxLQUFLa0QsS0FBTCxDQUFXbEQsS0FBS21ELE1BQUwsS0FBZ0JwRSxDQUEzQixDQUFKO0FBQ0FrRSxnQkFBSUwsSUFBSTdELENBQUosQ0FBSjtBQUNBNkQsZ0JBQUk3RCxDQUFKLElBQVM2RCxJQUFJSSxDQUFKLENBQVQ7QUFDQUosZ0JBQUlJLENBQUosSUFBU0MsQ0FBVDtBQUNIO0FBQ0QsZUFBT0wsR0FBUDtBQUNILEtBckJVOztBQXVCWFEsaUJBQWEscUJBQVNSLEdBQVQsRUFBYztBQUN2QixZQUFJN0QsQ0FBSjtBQUFBLFlBQU9pRSxDQUFQO0FBQUEsWUFBVUssTUFBTSxFQUFoQjtBQUFBLFlBQW9CQyxPQUFPLEVBQTNCO0FBQ0EsYUFBTXZFLElBQUksQ0FBVixFQUFhQSxJQUFJNkQsSUFBSTNELE1BQXJCLEVBQTZCRixHQUE3QixFQUFrQztBQUM5QnNFLGtCQUFNLEVBQU47QUFDQSxpQkFBTUwsSUFBSSxDQUFWLEVBQWFBLElBQUlKLElBQUk3RCxDQUFKLEVBQU9FLE1BQXhCLEVBQWdDK0QsR0FBaEMsRUFBcUM7QUFDakNLLG9CQUFJTCxDQUFKLElBQVNKLElBQUk3RCxDQUFKLEVBQU9pRSxDQUFQLENBQVQ7QUFDSDtBQUNETSxpQkFBS3ZFLENBQUwsSUFBVSxNQUFNc0UsSUFBSUUsSUFBSixDQUFTLEdBQVQsQ0FBTixHQUFzQixHQUFoQztBQUNIO0FBQ0QsZUFBTyxNQUFNRCxLQUFLQyxJQUFMLENBQVUsT0FBVixDQUFOLEdBQTJCLEdBQWxDO0FBQ0gsS0FqQ1U7O0FBbUNYOzs7O0FBSUFDLGVBQVcsbUJBQVNaLEdBQVQsRUFBY1ksVUFBZCxFQUF5QkMsU0FBekIsRUFBb0M7QUFDM0MsWUFBSTFFLENBQUo7QUFBQSxZQUFPMkUsUUFBUSxFQUFmO0FBQ0EsYUFBTTNFLElBQUksQ0FBVixFQUFhQSxJQUFJNkQsSUFBSTNELE1BQXJCLEVBQTZCRixHQUE3QixFQUFrQztBQUM5QixnQkFBSTBFLFVBQVVFLEtBQVYsQ0FBZ0JmLEdBQWhCLEVBQXFCLENBQUNBLElBQUk3RCxDQUFKLENBQUQsQ0FBckIsS0FBa0N5RSxVQUF0QyxFQUFpRDtBQUM3Q0Usc0JBQU0zQyxJQUFOLENBQVc2QixJQUFJN0QsQ0FBSixDQUFYO0FBQ0g7QUFDSjtBQUNELGVBQU8yRSxLQUFQO0FBQ0gsS0EvQ1U7O0FBaURYRSxjQUFVLGtCQUFTaEIsR0FBVCxFQUFjO0FBQ3BCLFlBQUk3RCxDQUFKO0FBQUEsWUFBTzhFLE1BQU0sQ0FBYjtBQUNBLGFBQU05RSxJQUFJLENBQVYsRUFBYUEsSUFBSTZELElBQUkzRCxNQUFyQixFQUE2QkYsR0FBN0IsRUFBa0M7QUFDOUIsZ0JBQUk2RCxJQUFJN0QsQ0FBSixJQUFTNkQsSUFBSWlCLEdBQUosQ0FBYixFQUF1QjtBQUNuQkEsc0JBQU05RSxDQUFOO0FBQ0g7QUFDSjtBQUNELGVBQU84RSxHQUFQO0FBQ0gsS0F6RFU7O0FBMkRYQSxTQUFLLGFBQVNqQixHQUFULEVBQWM7QUFDZixZQUFJN0QsQ0FBSjtBQUFBLFlBQU84RSxNQUFNLENBQWI7QUFDQSxhQUFNOUUsSUFBSSxDQUFWLEVBQWFBLElBQUk2RCxJQUFJM0QsTUFBckIsRUFBNkJGLEdBQTdCLEVBQWtDO0FBQzlCLGdCQUFJNkQsSUFBSTdELENBQUosSUFBUzhFLEdBQWIsRUFBa0I7QUFDZEEsc0JBQU1qQixJQUFJN0QsQ0FBSixDQUFOO0FBQ0g7QUFDSjtBQUNELGVBQU84RSxHQUFQO0FBQ0gsS0FuRVU7O0FBcUVYckUsU0FBSyxhQUFTb0QsR0FBVCxFQUFjO0FBQ2YsWUFBSTNELFNBQVMyRCxJQUFJM0QsTUFBakI7QUFBQSxZQUNJTyxNQUFNLENBRFY7O0FBR0EsZUFBT1AsUUFBUCxFQUFpQjtBQUNiTyxtQkFBT29ELElBQUkzRCxNQUFKLENBQVA7QUFDSDtBQUNELGVBQU9PLEdBQVA7QUFDSDtBQTdFVSxDQUFmLEM7Ozs7Ozs7Ozs7Ozs7O0FDQUE7OztBQUdBLFNBQVNzRSxTQUFULENBQW1CQyxJQUFuQixFQUF5QnRGLFdBQXpCLEVBQXNDO0FBQ2xDc0YsV0FBTyxxREFBTUMsaUJBQU4sRUFBeUJELElBQXpCLENBQVA7QUFDQXhGLElBQUEsZ0VBQUFBLENBQWMwRixJQUFkLENBQW1CLElBQW5CLEVBQXlCRixJQUF6QixFQUErQnRGLFdBQS9CO0FBQ0g7O0FBRUQsU0FBU3VGLGVBQVQsR0FBMkI7QUFDdkIsUUFBSXhGLFNBQVMsRUFBYjs7QUFFQTRELFdBQU84QixJQUFQLENBQVlKLFVBQVVuQixXQUF0QixFQUFtQ3dCLE9BQW5DLENBQTJDLFVBQVNDLEdBQVQsRUFBYztBQUNyRDVGLGVBQU80RixHQUFQLElBQWNOLFVBQVVuQixXQUFWLENBQXNCeUIsR0FBdEIsRUFBMkJDLE9BQXpDO0FBQ0gsS0FGRDtBQUdBLFdBQU83RixNQUFQO0FBQ0g7O0FBRUQsSUFBSThGLGFBQWE7QUFDYkMsa0JBQWMsRUFBQzFDLE9BQU8sQ0FBUixFQUREO0FBRWIyQyxrQkFBYyxFQUFDM0MsT0FBTyxFQUFSLEVBRkQ7QUFHYjRDLG1CQUFlLEVBQUM1QyxPQUFPLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQVIsRUFIRjtBQUliNkMsa0JBQWMsRUFBQzdDLE9BQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBUixFQUpEO0FBS2I4QyxvQkFBZ0IsRUFBQzlDLE9BQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixDQUFSLEVBTEg7QUFNYitDLDZCQUF5QixFQUFDL0MsT0FBTyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFSLEVBTlo7QUFPYmdELGtCQUFjLEVBQUNoRCxPQUFPLENBQ2xCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQURrQixFQUVsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FGa0IsRUFHbEIsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBSGtCLEVBSWxCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUprQixFQUtsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FMa0IsRUFNbEIsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBTmtCLEVBT2xCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQVBrQixFQVFsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FSa0IsRUFTbEIsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBVGtCLEVBVWxCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQVZrQixFQVdsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FYa0IsRUFZbEIsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBWmtCLEVBYWxCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQWJrQixFQWNsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0Fka0IsRUFlbEIsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBZmtCLEVBZ0JsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FoQmtCLEVBaUJsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FqQmtCLEVBa0JsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FsQmtCLEVBbUJsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FuQmtCLEVBb0JsQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FwQmtCLENBQVIsRUFQRDtBQTZCYmlELG9CQUFnQixFQUFDakQsT0FBTyxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZLEVBQVosRUFBZ0IsRUFBaEIsRUFBb0IsRUFBcEIsRUFBd0IsRUFBeEIsRUFBNEIsRUFBNUIsRUFBZ0MsRUFBaEMsRUFBb0MsRUFBcEMsQ0FBUixFQTdCSDtBQThCYmhDLHVCQUFtQixFQUFDZ0MsT0FBTyxJQUFSLEVBOUJOO0FBK0Jia0Qsb0JBQWdCLEVBQUNsRCxPQUFPLElBQVIsRUEvQkg7QUFnQ2JGLFlBQVEsRUFBQ0UsT0FBTyxRQUFSLEVBQWtCUyxXQUFXLEtBQTdCO0FBaENLLENBQWpCOztBQW1DQXdCLFVBQVVuRixTQUFWLEdBQXNCeUQsT0FBTzRDLE1BQVAsQ0FBYyxnRUFBQXpHLENBQWNJLFNBQTVCLEVBQXVDMkYsVUFBdkMsQ0FBdEI7QUFDQVIsVUFBVW5GLFNBQVYsQ0FBb0JzRyxXQUFwQixHQUFrQ25CLFNBQWxDOztBQUVBQSxVQUFVbkYsU0FBVixDQUFvQnVHLFdBQXBCLEdBQWtDLFVBQVNwRyxLQUFULEVBQWdCcUcsU0FBaEIsRUFBMkI7QUFDekQsUUFBSWhHLFVBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBQWQ7QUFBQSxRQUNJSixDQURKO0FBQUEsUUFFSTRCLE9BQU8sSUFGWDtBQUFBLFFBR0lSLFNBQVNyQixLQUhiO0FBQUEsUUFJSThCLFVBQVUsQ0FBQ0QsS0FBS2pDLElBQUwsQ0FBVXlCLE1BQVYsQ0FKZjtBQUFBLFFBS0lVLGFBQWEsQ0FMakI7QUFBQSxRQU1JQyxZQUFZO0FBQ1J4QixlQUFPUSxPQUFPQyxTQUROO0FBRVJYLGNBQU0sQ0FBQyxDQUZDO0FBR1JOLGVBQU9BLEtBSEM7QUFJUmtDLGFBQUtsQztBQUpHLEtBTmhCO0FBQUEsUUFZSU0sSUFaSjtBQUFBLFFBYUlFLEtBYko7O0FBZUEsUUFBSSxDQUFDNkYsU0FBTCxFQUFnQjtBQUNaQSxvQkFBWXhFLEtBQUtrRSxZQUFMLENBQWtCNUYsTUFBOUI7QUFDSDs7QUFFRCxTQUFNRixJQUFJb0IsTUFBVixFQUFrQnBCLElBQUk0QixLQUFLakMsSUFBTCxDQUFVTyxNQUFoQyxFQUF3Q0YsR0FBeEMsRUFBNkM7QUFDekMsWUFBSTRCLEtBQUtqQyxJQUFMLENBQVVLLENBQVYsSUFBZTZCLE9BQW5CLEVBQTRCO0FBQ3hCekIsb0JBQVEwQixVQUFSO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZ0JBQUlBLGVBQWUxQixRQUFRRixNQUFSLEdBQWlCLENBQXBDLEVBQXVDO0FBQ25DLHFCQUFLRyxPQUFPLENBQVosRUFBZUEsT0FBTytGLFNBQXRCLEVBQWlDL0YsTUFBakMsRUFBeUM7QUFDckNFLDRCQUFRcUIsS0FBS3pCLGFBQUwsQ0FBbUJDLE9BQW5CLEVBQTRCd0IsS0FBS2tFLFlBQUwsQ0FBa0J6RixJQUFsQixDQUE1QixDQUFSO0FBQ0Esd0JBQUlFLFFBQVF3QixVQUFVeEIsS0FBdEIsRUFBNkI7QUFDekJ3QixrQ0FBVTFCLElBQVYsR0FBaUJBLElBQWpCO0FBQ0EwQixrQ0FBVXhCLEtBQVYsR0FBa0JBLEtBQWxCO0FBQ0g7QUFDSjtBQUNEd0IsMEJBQVVFLEdBQVYsR0FBZ0JqQyxDQUFoQjtBQUNBLG9CQUFJK0IsVUFBVXhCLEtBQVYsR0FBa0JxQixLQUFLb0UsY0FBM0IsRUFBMkM7QUFDdkMsMkJBQU8sSUFBUDtBQUNIO0FBQ0QsdUJBQU9qRSxTQUFQO0FBQ0gsYUFiRCxNQWFPO0FBQ0hEO0FBQ0g7QUFDRDFCLG9CQUFRMEIsVUFBUixJQUFzQixDQUF0QjtBQUNBRCxzQkFBVSxDQUFDQSxPQUFYO0FBQ0g7QUFDSjtBQUNELFdBQU8sSUFBUDtBQUNILENBN0NEOztBQStDQWtELFVBQVVuRixTQUFWLENBQW9CeUcsWUFBcEIsR0FBbUMsVUFBU2xFLE9BQVQsRUFBa0JmLE1BQWxCLEVBQTBCUyxPQUExQixFQUFtQ3lFLFNBQW5DLEVBQThDM0UsT0FBOUMsRUFBdUQ7QUFDdEYsUUFBSXZCLFVBQVUsRUFBZDtBQUFBLFFBQ0l3QixPQUFPLElBRFg7QUFBQSxRQUVJNUIsQ0FGSjtBQUFBLFFBR0k4QixhQUFhLENBSGpCO0FBQUEsUUFJSUMsWUFBWTtBQUNSeEIsZUFBT1EsT0FBT0MsU0FETjtBQUVSWCxjQUFNLENBQUMsQ0FGQztBQUdSTixlQUFPLENBSEM7QUFJUmtDLGFBQUs7QUFKRyxLQUpoQjtBQUFBLFFBVUkxQixLQVZKO0FBQUEsUUFXSTBELENBWEo7QUFBQSxRQVlJeEQsR0FaSjs7QUFjQSxRQUFJLENBQUNXLE1BQUwsRUFBYTtBQUNUQSxpQkFBU1EsS0FBS1QsUUFBTCxDQUFjUyxLQUFLakMsSUFBbkIsQ0FBVDtBQUNIOztBQUVELFFBQUlrQyxZQUFZNUIsU0FBaEIsRUFBMkI7QUFDdkI0QixrQkFBVSxLQUFWO0FBQ0g7O0FBRUQsUUFBSXlFLGNBQWNyRyxTQUFsQixFQUE2QjtBQUN6QnFHLG9CQUFZLElBQVo7QUFDSDs7QUFFRCxRQUFLM0UsWUFBWTFCLFNBQWpCLEVBQTRCO0FBQ3hCMEIsa0JBQVVDLEtBQUtvRSxjQUFmO0FBQ0g7O0FBRUQsU0FBTWhHLElBQUksQ0FBVixFQUFhQSxJQUFJbUMsUUFBUWpDLE1BQXpCLEVBQWlDRixHQUFqQyxFQUFzQztBQUNsQ0ksZ0JBQVFKLENBQVIsSUFBYSxDQUFiO0FBQ0g7O0FBRUQsU0FBTUEsSUFBSW9CLE1BQVYsRUFBa0JwQixJQUFJNEIsS0FBS2pDLElBQUwsQ0FBVU8sTUFBaEMsRUFBd0NGLEdBQXhDLEVBQTZDO0FBQ3pDLFlBQUk0QixLQUFLakMsSUFBTCxDQUFVSyxDQUFWLElBQWU2QixPQUFuQixFQUE0QjtBQUN4QnpCLG9CQUFRMEIsVUFBUjtBQUNILFNBRkQsTUFFTztBQUNILGdCQUFJQSxlQUFlMUIsUUFBUUYsTUFBUixHQUFpQixDQUFwQyxFQUF1QztBQUNuQ08sc0JBQU0sQ0FBTjtBQUNBLHFCQUFNd0QsSUFBSSxDQUFWLEVBQWFBLElBQUk3RCxRQUFRRixNQUF6QixFQUFpQytELEdBQWpDLEVBQXNDO0FBQ2xDeEQsMkJBQU9MLFFBQVE2RCxDQUFSLENBQVA7QUFDSDtBQUNEMUQsd0JBQVFxQixLQUFLekIsYUFBTCxDQUFtQkMsT0FBbkIsRUFBNEIrQixPQUE1QixDQUFSOztBQUVBLG9CQUFJNUIsUUFBUW9CLE9BQVosRUFBcUI7QUFDakJJLDhCQUFVeEIsS0FBVixHQUFrQkEsS0FBbEI7QUFDQXdCLDhCQUFVaEMsS0FBVixHQUFrQkMsSUFBSVMsR0FBdEI7QUFDQXNCLDhCQUFVRSxHQUFWLEdBQWdCakMsQ0FBaEI7QUFDQSwyQkFBTytCLFNBQVA7QUFDSDtBQUNELG9CQUFJdUUsU0FBSixFQUFlO0FBQ1gseUJBQU1yQyxJQUFJLENBQVYsRUFBYUEsSUFBSTdELFFBQVFGLE1BQVIsR0FBaUIsQ0FBbEMsRUFBcUMrRCxHQUFyQyxFQUEwQztBQUN0QzdELGdDQUFRNkQsQ0FBUixJQUFhN0QsUUFBUTZELElBQUksQ0FBWixDQUFiO0FBQ0g7QUFDRDdELDRCQUFRQSxRQUFRRixNQUFSLEdBQWlCLENBQXpCLElBQThCLENBQTlCO0FBQ0FFLDRCQUFRQSxRQUFRRixNQUFSLEdBQWlCLENBQXpCLElBQThCLENBQTlCO0FBQ0E0QjtBQUNILGlCQVBELE1BT087QUFDSCwyQkFBTyxJQUFQO0FBQ0g7QUFDSixhQXZCRCxNQXVCTztBQUNIQTtBQUNIO0FBQ0QxQixvQkFBUTBCLFVBQVIsSUFBc0IsQ0FBdEI7QUFDQUQsc0JBQVUsQ0FBQ0EsT0FBWDtBQUNIO0FBQ0o7QUFDRCxXQUFPLElBQVA7QUFDSCxDQXRFRDs7QUF3RUFrRCxVQUFVbkYsU0FBVixDQUFvQjJHLFVBQXBCLEdBQWlDLFlBQVc7QUFDeEMsUUFBSTNFLE9BQU8sSUFBWDtBQUFBLFFBQ0k0RSxzQkFESjtBQUFBLFFBRUlwRixTQUFTUSxLQUFLVCxRQUFMLENBQWNTLEtBQUtqQyxJQUFuQixDQUZiO0FBQUEsUUFHSThHLFNBSEo7O0FBS0EsV0FBTyxDQUFDQSxTQUFSLEVBQW1CO0FBQ2ZBLG9CQUFZN0UsS0FBS3lFLFlBQUwsQ0FBa0J6RSxLQUFLOEQsYUFBdkIsRUFBc0N0RSxNQUF0QyxDQUFaO0FBQ0EsWUFBSSxDQUFDcUYsU0FBTCxFQUFnQjtBQUNaLG1CQUFPLElBQVA7QUFDSDtBQUNERCxpQ0FBeUJDLFVBQVUxRyxLQUFWLElBQW1CMEcsVUFBVXhFLEdBQVYsR0FBZ0J3RSxVQUFVMUcsS0FBN0MsQ0FBekI7QUFDQSxZQUFJeUcsMEJBQTBCLENBQTlCLEVBQWlDO0FBQzdCLGdCQUFJNUUsS0FBS2lCLFdBQUwsQ0FBaUIyRCxzQkFBakIsRUFBeUNDLFVBQVUxRyxLQUFuRCxFQUEwRCxDQUExRCxDQUFKLEVBQWtFO0FBQzlELHVCQUFPMEcsU0FBUDtBQUNIO0FBQ0o7QUFDRHJGLGlCQUFTcUYsVUFBVXhFLEdBQW5CO0FBQ0F3RSxvQkFBWSxJQUFaO0FBQ0g7QUFDSixDQXBCRDs7QUFzQkExQixVQUFVbkYsU0FBVixDQUFvQjhHLHlCQUFwQixHQUFnRCxVQUFTQyxPQUFULEVBQWtCO0FBQzlELFFBQUkvRSxPQUFPLElBQVg7QUFBQSxRQUNJZ0YscUJBREo7O0FBR0FBLDRCQUF3QkQsUUFBUTFFLEdBQVIsSUFBZTBFLFFBQVExRSxHQUFSLEdBQWMwRSxRQUFRNUcsS0FBckMsQ0FBeEI7QUFDQSxRQUFJNkcsd0JBQXdCaEYsS0FBS2pDLElBQUwsQ0FBVU8sTUFBdEMsRUFBOEM7QUFDMUMsWUFBSTBCLEtBQUtpQixXQUFMLENBQWlCOEQsUUFBUTFFLEdBQXpCLEVBQThCMkUscUJBQTlCLEVBQXFELENBQXJELENBQUosRUFBNkQ7QUFDekQsbUJBQU9ELE9BQVA7QUFDSDtBQUNKO0FBQ0QsV0FBTyxJQUFQO0FBQ0gsQ0FYRDs7QUFhQTVCLFVBQVVuRixTQUFWLENBQW9CaUgsUUFBcEIsR0FBK0IsVUFBU3pGLE1BQVQsRUFBaUJTLE9BQWpCLEVBQTBCO0FBQ3JELFFBQUlELE9BQU8sSUFBWDtBQUFBLFFBQ0krRSxVQUFVL0UsS0FBS3lFLFlBQUwsQ0FBa0J6RSxLQUFLK0QsWUFBdkIsRUFBcUN2RSxNQUFyQyxFQUE2Q1MsT0FBN0MsRUFBc0QsS0FBdEQsQ0FEZDs7QUFHQSxXQUFPOEUsWUFBWSxJQUFaLEdBQW1CL0UsS0FBSzhFLHlCQUFMLENBQStCQyxPQUEvQixDQUFuQixHQUE2RCxJQUFwRTtBQUNILENBTEQ7O0FBT0E1QixVQUFVbkYsU0FBVixDQUFvQmtILG9CQUFwQixHQUEyQyxVQUFTQyxhQUFULEVBQXdCO0FBQy9ELFFBQUkvRyxDQUFKO0FBQUEsUUFDSTRCLE9BQU8sSUFEWDs7QUFHQSxTQUFNNUIsSUFBSSxDQUFWLEVBQWFBLElBQUk0QixLQUFLbUUsY0FBTCxDQUFvQjdGLE1BQXJDLEVBQTZDRixHQUE3QyxFQUFrRDtBQUM5QyxZQUFJK0csa0JBQWtCbkYsS0FBS21FLGNBQUwsQ0FBb0IvRixDQUFwQixDQUF0QixFQUE4QztBQUMxQyxtQkFBT0EsQ0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLElBQVA7QUFDSCxDQVZEOztBQVlBK0UsVUFBVW5GLFNBQVYsQ0FBb0JvSCxjQUFwQixHQUFxQyxVQUFTM0csSUFBVCxFQUFlK0IsTUFBZixFQUF1QjZFLFlBQXZCLEVBQXFDO0FBQ3RFLFFBQUlqSCxDQUFKO0FBQUEsUUFDSTRCLE9BQU8sSUFEWDtBQUFBLFFBRUltRixnQkFBZ0IsR0FGcEI7QUFBQSxRQUdJRyxVQUhKOztBQUtBLFNBQU1sSCxJQUFJLENBQVYsRUFBYUEsSUFBSSxDQUFqQixFQUFvQkEsR0FBcEIsRUFBeUI7QUFDckJLLGVBQU91QixLQUFLdUUsV0FBTCxDQUFpQjlGLEtBQUs0QixHQUF0QixDQUFQO0FBQ0EsWUFBSSxDQUFDNUIsSUFBTCxFQUFXO0FBQ1AsbUJBQU8sSUFBUDtBQUNIO0FBQ0QsWUFBSUEsS0FBS0EsSUFBTCxJQUFhdUIsS0FBSzZELFlBQXRCLEVBQW9DO0FBQ2hDcEYsaUJBQUtBLElBQUwsR0FBWUEsS0FBS0EsSUFBTCxHQUFZdUIsS0FBSzZELFlBQTdCO0FBQ0FzQiw2QkFBaUIsS0FBTSxJQUFJL0csQ0FBM0I7QUFDSCxTQUhELE1BR087QUFDSCtHLDZCQUFpQixLQUFNLElBQUkvRyxDQUEzQjtBQUNIO0FBQ0RvQyxlQUFPSixJQUFQLENBQVkzQixLQUFLQSxJQUFqQjtBQUNBNEcscUJBQWFqRixJQUFiLENBQWtCM0IsSUFBbEI7QUFDSDs7QUFFRDZHLGlCQUFhdEYsS0FBS2tGLG9CQUFMLENBQTBCQyxhQUExQixDQUFiO0FBQ0EsUUFBSUcsZUFBZSxJQUFuQixFQUF5QjtBQUNyQixlQUFPLElBQVA7QUFDSDtBQUNEOUUsV0FBTytFLE9BQVAsQ0FBZUQsVUFBZjs7QUFFQTdHLFdBQU91QixLQUFLeUUsWUFBTCxDQUFrQnpFLEtBQUtnRSxjQUF2QixFQUF1Q3ZGLEtBQUs0QixHQUE1QyxFQUFpRCxJQUFqRCxFQUF1RCxLQUF2RCxDQUFQO0FBQ0EsUUFBSTVCLFNBQVMsSUFBYixFQUFtQjtBQUNmLGVBQU8sSUFBUDtBQUNIO0FBQ0Q0RyxpQkFBYWpGLElBQWIsQ0FBa0IzQixJQUFsQjs7QUFFQSxTQUFNTCxJQUFJLENBQVYsRUFBYUEsSUFBSSxDQUFqQixFQUFvQkEsR0FBcEIsRUFBeUI7QUFDckJLLGVBQU91QixLQUFLdUUsV0FBTCxDQUFpQjlGLEtBQUs0QixHQUF0QixFQUEyQkwsS0FBSzZELFlBQWhDLENBQVA7QUFDQSxZQUFJLENBQUNwRixJQUFMLEVBQVc7QUFDUCxtQkFBTyxJQUFQO0FBQ0g7QUFDRDRHLHFCQUFhakYsSUFBYixDQUFrQjNCLElBQWxCO0FBQ0ErQixlQUFPSixJQUFQLENBQVkzQixLQUFLQSxJQUFqQjtBQUNIOztBQUVELFdBQU9BLElBQVA7QUFDSCxDQTNDRDs7QUE2Q0EwRSxVQUFVbkYsU0FBVixDQUFvQnlDLE9BQXBCLEdBQThCLFlBQVc7QUFDckMsUUFBSW9FLFNBQUo7QUFBQSxRQUNJN0UsT0FBTyxJQURYO0FBQUEsUUFFSXZCLElBRko7QUFBQSxRQUdJK0IsU0FBUyxFQUhiO0FBQUEsUUFJSTZFLGVBQWUsRUFKbkI7QUFBQSxRQUtJRyxhQUFhLEVBTGpCOztBQU9BWCxnQkFBWTdFLEtBQUsyRSxVQUFMLEVBQVo7QUFDQSxRQUFJLENBQUNFLFNBQUwsRUFBZ0I7QUFDWixlQUFPLElBQVA7QUFDSDtBQUNEcEcsV0FBTztBQUNIQSxjQUFNb0csVUFBVXBHLElBRGI7QUFFSE4sZUFBTzBHLFVBQVUxRyxLQUZkO0FBR0hrQyxhQUFLd0UsVUFBVXhFO0FBSFosS0FBUDtBQUtBZ0YsaUJBQWFqRixJQUFiLENBQWtCM0IsSUFBbEI7QUFDQUEsV0FBT3VCLEtBQUtvRixjQUFMLENBQW9CM0csSUFBcEIsRUFBMEIrQixNQUExQixFQUFrQzZFLFlBQWxDLENBQVA7QUFDQSxRQUFJLENBQUM1RyxJQUFMLEVBQVc7QUFDUCxlQUFPLElBQVA7QUFDSDtBQUNEQSxXQUFPdUIsS0FBS2lGLFFBQUwsQ0FBY3hHLEtBQUs0QixHQUFuQixFQUF3QixLQUF4QixDQUFQO0FBQ0EsUUFBSSxDQUFDNUIsSUFBTCxFQUFVO0FBQ04sZUFBTyxJQUFQO0FBQ0g7O0FBRUQ0RyxpQkFBYWpGLElBQWIsQ0FBa0IzQixJQUFsQjs7QUFFQTtBQUNBLFFBQUksQ0FBQ3VCLEtBQUt5RixTQUFMLENBQWVqRixNQUFmLENBQUwsRUFBNkI7QUFDekIsZUFBTyxJQUFQO0FBQ0g7O0FBRUQsUUFBSSxLQUFLMUMsV0FBTCxDQUFpQlEsTUFBakIsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDN0IsWUFBSW9ILE1BQU0sS0FBS0MsaUJBQUwsQ0FBdUJsSCxLQUFLNEIsR0FBNUIsQ0FBVjtBQUNBLFlBQUksQ0FBQ3FGLEdBQUwsRUFBVTtBQUNOLG1CQUFPLElBQVA7QUFDSDtBQUNELFlBQUlFLFdBQVdGLElBQUlMLFlBQUosQ0FBaUJLLElBQUlMLFlBQUosQ0FBaUIvRyxNQUFqQixHQUF3QixDQUF6QyxDQUFmO0FBQUEsWUFDSXlHLFVBQVU7QUFDTjVHLG1CQUFPeUgsU0FBU3pILEtBQVQsSUFBbUIsQ0FBQ3lILFNBQVN2RixHQUFULEdBQWV1RixTQUFTekgsS0FBekIsSUFBa0MsQ0FBbkMsR0FBd0MsQ0FBMUQsQ0FERDtBQUVOa0MsaUJBQUt1RixTQUFTdkY7QUFGUixTQURkO0FBS0EsWUFBRyxDQUFDTCxLQUFLOEUseUJBQUwsQ0FBK0JDLE9BQS9CLENBQUosRUFBNkM7QUFDekMsbUJBQU8sSUFBUDtBQUNIO0FBQ0RTLHFCQUFhO0FBQ1RLLHdCQUFZSCxHQURIO0FBRVRqSCxrQkFBTStCLE9BQU9vQyxJQUFQLENBQVksRUFBWixJQUFrQjhDLElBQUlqSDtBQUZuQixTQUFiO0FBSUg7O0FBRUQ7QUFDSUEsY0FBTStCLE9BQU9vQyxJQUFQLENBQVksRUFBWixDQURWO0FBRUl6RSxlQUFPMEcsVUFBVTFHLEtBRnJCO0FBR0lrQyxhQUFLNUIsS0FBSzRCLEdBSGQ7QUFJSXlGLGlCQUFTLEVBSmI7QUFLSWpCLG1CQUFXQSxTQUxmO0FBTUlRLHNCQUFjQTtBQU5sQixPQU9PRyxVQVBQO0FBU0gsQ0E5REQ7O0FBZ0VBckMsVUFBVW5GLFNBQVYsQ0FBb0IySCxpQkFBcEIsR0FBd0MsVUFBU25HLE1BQVQsRUFBaUI7QUFDckQsUUFBSXBCLENBQUo7QUFBQSxRQUNJRCxRQUFRLEtBQUtvQixRQUFMLENBQWMsS0FBS3hCLElBQW5CLEVBQXlCeUIsTUFBekIsQ0FEWjtBQUFBLFFBRUlxRixZQUFZLEtBQUtKLFlBQUwsQ0FBa0IsS0FBS1IsdUJBQXZCLEVBQWdEOUYsS0FBaEQsRUFBdUQsS0FBdkQsRUFBOEQsS0FBOUQsQ0FGaEI7QUFBQSxRQUdJcUMsTUFISjs7QUFLQSxRQUFJcUUsY0FBYyxJQUFsQixFQUF3QjtBQUNwQixlQUFPLElBQVA7QUFDSDs7QUFFRCxTQUFLekcsSUFBSSxDQUFULEVBQVlBLElBQUksS0FBS04sV0FBTCxDQUFpQlEsTUFBakMsRUFBeUNGLEdBQXpDLEVBQThDO0FBQzFDb0MsaUJBQVMsS0FBSzFDLFdBQUwsQ0FBaUJNLENBQWpCLEVBQW9CMkgsTUFBcEIsQ0FBMkIsS0FBS2hJLElBQWhDLEVBQXNDOEcsVUFBVXhFLEdBQWhELENBQVQ7QUFDQSxZQUFJRyxXQUFXLElBQWYsRUFBcUI7QUFDakIsbUJBQU87QUFDSC9CLHNCQUFNK0IsT0FBTy9CLElBRFY7QUFFSE4sNEJBRkc7QUFHSDBHLG9DQUhHO0FBSUh4RSxxQkFBS0csT0FBT0gsR0FKVDtBQUtIeUYseUJBQVMsRUFMTjtBQU1IVCw4QkFBYzdFLE9BQU82RTtBQU5sQixhQUFQO0FBUUg7QUFDSjtBQUNELFdBQU8sSUFBUDtBQUNILENBeEJEOztBQTBCQWxDLFVBQVVuRixTQUFWLENBQW9CeUgsU0FBcEIsR0FBZ0MsVUFBU2pGLE1BQVQsRUFBaUI7QUFDN0MsUUFBSTNCLE1BQU0sQ0FBVjtBQUFBLFFBQWFULENBQWI7O0FBRUEsU0FBTUEsSUFBSW9DLE9BQU9sQyxNQUFQLEdBQWdCLENBQTFCLEVBQTZCRixLQUFLLENBQWxDLEVBQXFDQSxLQUFLLENBQTFDLEVBQTZDO0FBQ3pDUyxlQUFPMkIsT0FBT3BDLENBQVAsQ0FBUDtBQUNIO0FBQ0RTLFdBQU8sQ0FBUDtBQUNBLFNBQU1ULElBQUlvQyxPQUFPbEMsTUFBUCxHQUFnQixDQUExQixFQUE2QkYsS0FBSyxDQUFsQyxFQUFxQ0EsS0FBSyxDQUExQyxFQUE2QztBQUN6Q1MsZUFBTzJCLE9BQU9wQyxDQUFQLENBQVA7QUFDSDtBQUNELFdBQU9TLE1BQU0sRUFBTixLQUFhLENBQXBCO0FBQ0gsQ0FYRDs7QUFhQXNFLFVBQVVuQixXQUFWLEdBQXdCO0FBQ3BCbEUsaUJBQWE7QUFDVCxnQkFBUSxpQkFEQztBQUVULG1CQUFXLEVBRkY7QUFHVCx1QkFBZTtBQUhOO0FBRE8sQ0FBeEI7O0FBUUEsd0RBQWdCcUYsU0FBaEIsQzs7Ozs7O0FDaFlBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDNUJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7O0FDYkE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7QUMzQkEsd0RBQWU7QUFDWDZDLGNBQVUsa0JBQVNDLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsR0FBcEIsRUFBeUJDLEtBQXpCLEVBQStCO0FBQ3JDRCxZQUFJRSxXQUFKLEdBQWtCRCxNQUFNRSxLQUF4QjtBQUNBSCxZQUFJSSxTQUFKLEdBQWdCSCxNQUFNRSxLQUF0QjtBQUNBSCxZQUFJSyxTQUFKLEdBQWdCLENBQWhCO0FBQ0FMLFlBQUlNLFNBQUo7QUFDQU4sWUFBSU8sVUFBSixDQUFlVCxJQUFJM0QsQ0FBbkIsRUFBc0IyRCxJQUFJVSxDQUExQixFQUE2QlQsS0FBSzVELENBQWxDLEVBQXFDNEQsS0FBS1MsQ0FBMUM7QUFDSCxLQVBVO0FBUVhDLGNBQVUsa0JBQVNDLElBQVQsRUFBZUMsR0FBZixFQUFvQlgsR0FBcEIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3RDRCxZQUFJRSxXQUFKLEdBQWtCRCxNQUFNRSxLQUF4QjtBQUNBSCxZQUFJSSxTQUFKLEdBQWdCSCxNQUFNRSxLQUF0QjtBQUNBSCxZQUFJSyxTQUFKLEdBQWdCSixNQUFNSSxTQUF0QjtBQUNBTCxZQUFJTSxTQUFKO0FBQ0FOLFlBQUlZLE1BQUosQ0FBV0YsS0FBSyxDQUFMLEVBQVFDLElBQUl4RSxDQUFaLENBQVgsRUFBMkJ1RSxLQUFLLENBQUwsRUFBUUMsSUFBSUgsQ0FBWixDQUEzQjtBQUNBLGFBQUssSUFBSXRFLElBQUksQ0FBYixFQUFnQkEsSUFBSXdFLEtBQUt2SSxNQUF6QixFQUFpQytELEdBQWpDLEVBQXNDO0FBQ2xDOEQsZ0JBQUlhLE1BQUosQ0FBV0gsS0FBS3hFLENBQUwsRUFBUXlFLElBQUl4RSxDQUFaLENBQVgsRUFBMkJ1RSxLQUFLeEUsQ0FBTCxFQUFReUUsSUFBSUgsQ0FBWixDQUEzQjtBQUNIO0FBQ0RSLFlBQUljLFNBQUo7QUFDQWQsWUFBSWUsTUFBSjtBQUNILEtBbkJVO0FBb0JYQyxlQUFXLG1CQUFTQyxTQUFULEVBQW9CbEIsSUFBcEIsRUFBMEJDLEdBQTFCLEVBQStCO0FBQ3RDLFlBQUlrQixhQUFhbEIsSUFBSW1CLFlBQUosQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsRUFBdUJwQixLQUFLNUQsQ0FBNUIsRUFBK0I0RCxLQUFLUyxDQUFwQyxDQUFqQjtBQUFBLFlBQ0lZLE9BQU9GLFdBQVdFLElBRHRCO0FBQUEsWUFFSUMsZUFBZUosVUFBVTlJLE1BRjdCO0FBQUEsWUFHSW1KLGdCQUFnQkYsS0FBS2pKLE1BSHpCO0FBQUEsWUFJSTRDLEtBSko7O0FBTUEsWUFBSXVHLGdCQUFnQkQsWUFBaEIsS0FBaUMsQ0FBckMsRUFBd0M7QUFDcEMsbUJBQU8sS0FBUDtBQUNIO0FBQ0QsZUFBT0EsY0FBUCxFQUFzQjtBQUNsQnRHLG9CQUFRa0csVUFBVUksWUFBVixDQUFSO0FBQ0FELGlCQUFLLEVBQUVFLGFBQVAsSUFBd0IsR0FBeEI7QUFDQUYsaUJBQUssRUFBRUUsYUFBUCxJQUF3QnZHLEtBQXhCO0FBQ0FxRyxpQkFBSyxFQUFFRSxhQUFQLElBQXdCdkcsS0FBeEI7QUFDQXFHLGlCQUFLLEVBQUVFLGFBQVAsSUFBd0J2RyxLQUF4QjtBQUNIO0FBQ0RpRixZQUFJdUIsWUFBSixDQUFpQkwsVUFBakIsRUFBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEM7QUFDQSxlQUFPLElBQVA7QUFDSDtBQXZDVSxDQUFmLEM7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDL0JBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUNMQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLEVBQUU7QUFDYixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDcEJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ2pCQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDckJBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUNwQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0JBQWtCLEVBQUU7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxrQkFBa0IsRUFBRTtBQUNsRTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkNBO0FBQ0E7QUFDQSxJQUFNTSxPQUFPO0FBQ1RDLFdBQU8sbUJBQUFDLENBQVEsQ0FBUjtBQURFLENBQWI7QUFHQSxJQUFNQyxPQUFPO0FBQ1RGLFdBQU8sbUJBQUFDLENBQVEsRUFBUjtBQURFLENBQWI7O0FBSUE7Ozs7O0FBS08sU0FBU0UsUUFBVCxDQUFrQnpGLENBQWxCLEVBQXFCcUUsQ0FBckIsRUFBd0I7QUFDM0IsUUFBSXFCLE9BQU87QUFDUDFGLFdBQUdBLENBREk7QUFFUHFFLFdBQUdBLENBRkk7QUFHUHNCLGdCQUFRLGtCQUFXO0FBQ2YsbUJBQU9OLEtBQUtDLEtBQUwsQ0FBVyxDQUFDLEtBQUt0RixDQUFOLEVBQVMsS0FBS3FFLENBQWQsQ0FBWCxDQUFQO0FBQ0gsU0FMTTtBQU1QdUIsZ0JBQVEsa0JBQVc7QUFDZixtQkFBT0osS0FBS0YsS0FBTCxDQUFXLENBQUMsS0FBS3RGLENBQU4sRUFBUyxLQUFLcUUsQ0FBZCxFQUFpQixDQUFqQixDQUFYLENBQVA7QUFDSCxTQVJNO0FBU1B3QixlQUFPLGlCQUFXO0FBQ2QsaUJBQUs3RixDQUFMLEdBQVMsS0FBS0EsQ0FBTCxHQUFTLEdBQVQsR0FBZWpELEtBQUtrRCxLQUFMLENBQVcsS0FBS0QsQ0FBTCxHQUFTLEdBQXBCLENBQWYsR0FBMENqRCxLQUFLa0QsS0FBTCxDQUFXLEtBQUtELENBQUwsR0FBUyxHQUFwQixDQUFuRDtBQUNBLGlCQUFLcUUsQ0FBTCxHQUFTLEtBQUtBLENBQUwsR0FBUyxHQUFULEdBQWV0SCxLQUFLa0QsS0FBTCxDQUFXLEtBQUtvRSxDQUFMLEdBQVMsR0FBcEIsQ0FBZixHQUEwQ3RILEtBQUtrRCxLQUFMLENBQVcsS0FBS29FLENBQUwsR0FBUyxHQUFwQixDQUFuRDtBQUNBLG1CQUFPLElBQVA7QUFDSDtBQWJNLEtBQVg7QUFlQSxXQUFPcUIsSUFBUDtBQUNIOztBQUVEOzs7O0FBSU8sU0FBU0kscUJBQVQsQ0FBK0JDLFlBQS9CLEVBQTZDQyxlQUE3QyxFQUE4RDtBQUNqRSxRQUFJbEIsWUFBWWlCLGFBQWFkLElBQTdCO0FBQ0EsUUFBSWdCLFFBQVFGLGFBQWFuQyxJQUFiLENBQWtCNUQsQ0FBOUI7QUFDQSxRQUFJa0csU0FBU0gsYUFBYW5DLElBQWIsQ0FBa0JTLENBQS9CO0FBQ0EsUUFBSThCLG9CQUFvQkgsZ0JBQWdCZixJQUF4QztBQUNBLFFBQUkxSSxNQUFNLENBQVY7QUFBQSxRQUFhNkosT0FBTyxDQUFwQjtBQUFBLFFBQXVCQyxPQUFPLENBQTlCO0FBQUEsUUFBaUNDLE9BQU8sQ0FBeEM7QUFBQSxRQUEyQ0MsT0FBTyxDQUFsRDtBQUFBLFFBQXFEdkcsQ0FBckQ7QUFBQSxRQUF3RHFFLENBQXhEOztBQUVBO0FBQ0FnQyxXQUFPSixLQUFQO0FBQ0ExSixVQUFNLENBQU47QUFDQSxTQUFNOEgsSUFBSSxDQUFWLEVBQWFBLElBQUk2QixNQUFqQixFQUF5QjdCLEdBQXpCLEVBQThCO0FBQzFCOUgsZUFBT3VJLFVBQVVzQixJQUFWLENBQVA7QUFDQUQsMEJBQWtCRSxJQUFsQixLQUEyQjlKLEdBQTNCO0FBQ0E2SixnQkFBUUgsS0FBUjtBQUNBSSxnQkFBUUosS0FBUjtBQUNIOztBQUVERyxXQUFPLENBQVA7QUFDQUMsV0FBTyxDQUFQO0FBQ0E5SixVQUFNLENBQU47QUFDQSxTQUFNeUQsSUFBSSxDQUFWLEVBQWFBLElBQUlpRyxLQUFqQixFQUF3QmpHLEdBQXhCLEVBQTZCO0FBQ3pCekQsZUFBT3VJLFVBQVVzQixJQUFWLENBQVA7QUFDQUQsMEJBQWtCRSxJQUFsQixLQUEyQjlKLEdBQTNCO0FBQ0E2SjtBQUNBQztBQUNIOztBQUVELFNBQU1oQyxJQUFJLENBQVYsRUFBYUEsSUFBSTZCLE1BQWpCLEVBQXlCN0IsR0FBekIsRUFBOEI7QUFDMUIrQixlQUFPL0IsSUFBSTRCLEtBQUosR0FBWSxDQUFuQjtBQUNBSSxlQUFPLENBQUNoQyxJQUFJLENBQUwsSUFBVTRCLEtBQVYsR0FBa0IsQ0FBekI7QUFDQUssZUFBT2pDLElBQUk0QixLQUFYO0FBQ0FNLGVBQU8sQ0FBQ2xDLElBQUksQ0FBTCxJQUFVNEIsS0FBakI7QUFDQSxhQUFNakcsSUFBSSxDQUFWLEVBQWFBLElBQUlpRyxLQUFqQixFQUF3QmpHLEdBQXhCLEVBQTZCO0FBQ3pCbUcsOEJBQWtCQyxJQUFsQixLQUNJdEIsVUFBVXNCLElBQVYsSUFBa0JELGtCQUFrQkUsSUFBbEIsQ0FBbEIsR0FBNENGLGtCQUFrQkcsSUFBbEIsQ0FBNUMsR0FBc0VILGtCQUFrQkksSUFBbEIsQ0FEMUU7QUFFQUg7QUFDQUM7QUFDQUM7QUFDQUM7QUFDSDtBQUNKO0FBQ0o7O0FBRU0sU0FBU0Msb0JBQVQsQ0FBOEJULFlBQTlCLEVBQTRDQyxlQUE1QyxFQUE2RDtBQUNoRSxRQUFJbEIsWUFBWWlCLGFBQWFkLElBQTdCO0FBQ0EsUUFBSWdCLFFBQVFGLGFBQWFuQyxJQUFiLENBQWtCNUQsQ0FBOUI7QUFDQSxRQUFJa0csU0FBU0gsYUFBYW5DLElBQWIsQ0FBa0JTLENBQS9CO0FBQ0EsUUFBSThCLG9CQUFvQkgsZ0JBQWdCZixJQUF4QztBQUNBLFFBQUkxSSxNQUFNLENBQVY7O0FBRUE7QUFDQSxTQUFLLElBQUlULElBQUksQ0FBYixFQUFnQkEsSUFBSW1LLEtBQXBCLEVBQTJCbkssR0FBM0IsRUFBZ0M7QUFDNUJTLGVBQU91SSxVQUFVaEosQ0FBVixDQUFQO0FBQ0FxSywwQkFBa0JySyxDQUFsQixJQUF1QlMsR0FBdkI7QUFDSDs7QUFFRCxTQUFLLElBQUlrSyxJQUFJLENBQWIsRUFBZ0JBLElBQUlQLE1BQXBCLEVBQTRCTyxHQUE1QixFQUFpQztBQUM3QmxLLGNBQU0sQ0FBTjtBQUNBLGFBQUssSUFBSW1LLElBQUksQ0FBYixFQUFnQkEsSUFBSVQsS0FBcEIsRUFBMkJTLEdBQTNCLEVBQWdDO0FBQzVCbkssbUJBQU91SSxVQUFVMkIsSUFBSVIsS0FBSixHQUFZUyxDQUF0QixDQUFQO0FBQ0FQLDhCQUFvQk0sQ0FBRCxHQUFNUixLQUFQLEdBQWdCUyxDQUFsQyxJQUF1Q25LLE1BQU00SixrQkFBa0IsQ0FBQ00sSUFBSSxDQUFMLElBQVVSLEtBQVYsR0FBa0JTLENBQXBDLENBQTdDO0FBQ0g7QUFDSjtBQUNKOztBQUVNLFNBQVNDLGNBQVQsQ0FBd0JaLFlBQXhCLEVBQXNDeEYsU0FBdEMsRUFBaURxRyxhQUFqRCxFQUFnRTtBQUNuRSxRQUFJLENBQUNBLGFBQUwsRUFBb0I7QUFDaEJBLHdCQUFnQmIsWUFBaEI7QUFDSDtBQUNELFFBQUlqQixZQUFZaUIsYUFBYWQsSUFBN0I7QUFBQSxRQUFtQ2pKLFNBQVM4SSxVQUFVOUksTUFBdEQ7QUFBQSxRQUE4RDZLLGFBQWFELGNBQWMzQixJQUF6Rjs7QUFFQSxXQUFPakosUUFBUCxFQUFpQjtBQUNiNkssbUJBQVc3SyxNQUFYLElBQXFCOEksVUFBVTlJLE1BQVYsSUFBb0J1RSxTQUFwQixHQUFnQyxDQUFoQyxHQUFvQyxDQUF6RDtBQUNIO0FBQ0o7O0FBRU0sU0FBU3VHLGdCQUFULENBQTBCZixZQUExQixFQUF3Q2dCLFlBQXhDLEVBQXNEO0FBQ3pELFFBQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNmQSx1QkFBZSxDQUFmO0FBQ0g7QUFDRCxRQUFJakMsWUFBWWlCLGFBQWFkLElBQTdCO0FBQUEsUUFDSWpKLFNBQVM4SSxVQUFVOUksTUFEdkI7QUFBQSxRQUVJZ0wsV0FBVyxJQUFJRCxZQUZuQjtBQUFBLFFBR0lFLFlBQVksS0FBS0YsWUFIckI7QUFBQSxRQUlJRyxPQUFPLElBQUlDLFVBQUosQ0FBZUYsU0FBZixDQUpYOztBQU1BLFdBQU9qTCxRQUFQLEVBQWlCO0FBQ2JrTCxhQUFLcEMsVUFBVTlJLE1BQVYsS0FBcUJnTCxRQUExQjtBQUNIO0FBQ0QsV0FBT0UsSUFBUDtBQUNIOztBQUVNLFNBQVNFLFdBQVQsQ0FBcUJ4TCxJQUFyQixFQUEyQjtBQUM5QixRQUFJRSxDQUFKO0FBQUEsUUFDSUUsU0FBU0osS0FBS0ksTUFEbEI7QUFBQSxRQUVJcUwsT0FBT3pMLEtBQUssQ0FBTCxDQUZYO0FBQUEsUUFHSTBMLFNBQVMxTCxLQUFLLENBQUwsQ0FIYjtBQUFBLFFBSUkyTCxLQUpKOztBQU1BLFNBQUt6TCxJQUFJLENBQVQsRUFBWUEsSUFBSUUsU0FBUyxDQUF6QixFQUE0QkYsR0FBNUIsRUFBaUM7QUFDN0J5TCxnQkFBUTNMLEtBQUtFLElBQUksQ0FBVCxDQUFSO0FBQ0E7QUFDQUYsYUFBS0UsSUFBSSxDQUFULElBQWlCd0wsU0FBUyxDQUFWLEdBQWVELElBQWYsR0FBc0JFLEtBQXhCLEdBQWtDLEdBQWhEO0FBQ0FGLGVBQU9DLE1BQVA7QUFDQUEsaUJBQVNDLEtBQVQ7QUFDSDtBQUNELFdBQU8zTCxJQUFQO0FBQ0g7O0FBRU0sU0FBUzRMLHNCQUFULENBQWdDekIsWUFBaEMsRUFBOENnQixZQUE5QyxFQUE0RDtBQUMvRCxRQUFJLENBQUNBLFlBQUwsRUFBbUI7QUFDZkEsdUJBQWUsQ0FBZjtBQUNIO0FBQ0QsUUFBSUcsSUFBSjtBQUFBLFFBQ0kzRyxTQURKO0FBQUEsUUFFSXlHLFdBQVcsSUFBSUQsWUFGbkI7O0FBSUEsYUFBU1UsRUFBVCxDQUFZdkksSUFBWixFQUFrQm5CLEdBQWxCLEVBQXVCO0FBQ25CLFlBQUl4QixNQUFNLENBQVY7QUFBQSxZQUFhVCxDQUFiO0FBQ0EsYUFBTUEsSUFBSW9ELElBQVYsRUFBZ0JwRCxLQUFLaUMsR0FBckIsRUFBMEJqQyxHQUExQixFQUErQjtBQUMzQlMsbUJBQU8ySyxLQUFLcEwsQ0FBTCxDQUFQO0FBQ0g7QUFDRCxlQUFPUyxHQUFQO0FBQ0g7O0FBRUQsYUFBU21MLEVBQVQsQ0FBWXhJLElBQVosRUFBa0JuQixHQUFsQixFQUF1QjtBQUNuQixZQUFJakMsQ0FBSjtBQUFBLFlBQU9TLE1BQU0sQ0FBYjs7QUFFQSxhQUFNVCxJQUFJb0QsSUFBVixFQUFnQnBELEtBQUtpQyxHQUFyQixFQUEwQmpDLEdBQTFCLEVBQStCO0FBQzNCUyxtQkFBT1QsSUFBSW9MLEtBQUtwTCxDQUFMLENBQVg7QUFDSDs7QUFFRCxlQUFPUyxHQUFQO0FBQ0g7O0FBRUQsYUFBU29MLGtCQUFULEdBQThCO0FBQzFCLFlBQUlDLE1BQU0sQ0FBQyxDQUFELENBQVY7QUFBQSxZQUFlQyxFQUFmO0FBQUEsWUFBbUJDLEVBQW5CO0FBQUEsWUFBdUJDLEdBQXZCO0FBQUEsWUFBNEJDLENBQTVCO0FBQUEsWUFBK0JDLEVBQS9CO0FBQUEsWUFBbUNDLEVBQW5DO0FBQUEsWUFBdUNDLEdBQXZDO0FBQUEsWUFDSXZILE1BQU0sQ0FBQyxLQUFLbUcsWUFBTixJQUFzQixDQURoQzs7QUFHQUcsZUFBT0osaUJBQWlCZixZQUFqQixFQUErQmdCLFlBQS9CLENBQVA7QUFDQSxhQUFNaUIsSUFBSSxDQUFWLEVBQWFBLElBQUlwSCxHQUFqQixFQUFzQm9ILEdBQXRCLEVBQTJCO0FBQ3ZCSCxpQkFBS0osR0FBRyxDQUFILEVBQU1PLENBQU4sQ0FBTDtBQUNBRixpQkFBS0wsR0FBR08sSUFBSSxDQUFQLEVBQVVwSCxHQUFWLENBQUw7QUFDQW1ILGtCQUFNRixLQUFLQyxFQUFYO0FBQ0EsZ0JBQUlDLFFBQVEsQ0FBWixFQUFlO0FBQ1hBLHNCQUFNLENBQU47QUFDSDtBQUNERSxpQkFBS1AsR0FBRyxDQUFILEVBQU1NLENBQU4sSUFBV0YsRUFBaEI7QUFDQUksaUJBQUtSLEdBQUdNLElBQUksQ0FBUCxFQUFVcEgsR0FBVixJQUFpQmlILEVBQXRCO0FBQ0FNLGtCQUFNRixLQUFLQyxFQUFYO0FBQ0FOLGdCQUFJSSxDQUFKLElBQVNHLE1BQU1BLEdBQU4sR0FBWUosR0FBckI7QUFDSDtBQUNELGVBQU8sOERBQUE5SSxDQUFZMEIsUUFBWixDQUFxQmlILEdBQXJCLENBQVA7QUFDSDs7QUFFRHJILGdCQUFZb0gsb0JBQVo7QUFDQSxXQUFPcEgsYUFBYXlHLFFBQXBCO0FBQ0g7O0FBRU0sU0FBU29CLGFBQVQsQ0FBdUJyQyxZQUF2QixFQUFxQ2EsYUFBckMsRUFBb0Q7QUFDdkQsUUFBSXJHLFlBQVlpSCx1QkFBdUJ6QixZQUF2QixDQUFoQjs7QUFFQVksbUJBQWVaLFlBQWYsRUFBNkJ4RixTQUE3QixFQUF3Q3FHLGFBQXhDO0FBQ0EsV0FBT3JHLFNBQVA7QUFDSDs7QUFFRDtBQUNPLFNBQVM4SCxrQkFBVCxDQUE0QnRDLFlBQTVCLEVBQTBDQyxlQUExQyxFQUEyRFksYUFBM0QsRUFBMEU7QUFDN0VKLHlCQUFxQlQsWUFBckIsRUFBbUNDLGVBQW5DOztBQUVBLFFBQUksQ0FBQ1ksYUFBTCxFQUFvQjtBQUNoQkEsd0JBQWdCYixZQUFoQjtBQUNIO0FBQ0QsUUFBSWpCLFlBQVlpQixhQUFhZCxJQUE3QjtBQUNBLFFBQUk0QixhQUFhRCxjQUFjM0IsSUFBL0I7QUFDQSxRQUFJZ0IsUUFBUUYsYUFBYW5DLElBQWIsQ0FBa0I1RCxDQUE5QjtBQUNBLFFBQUlrRyxTQUFTSCxhQUFhbkMsSUFBYixDQUFrQlMsQ0FBL0I7QUFDQSxRQUFJOEIsb0JBQW9CSCxnQkFBZ0JmLElBQXhDO0FBQ0EsUUFBSTFJLE1BQU0sQ0FBVjtBQUFBLFFBQWFrSyxDQUFiO0FBQUEsUUFBZ0JDLENBQWhCO0FBQUEsUUFBbUI0QixTQUFTLENBQTVCO0FBQUEsUUFBK0JDLENBQS9CO0FBQUEsUUFBa0NDLENBQWxDO0FBQUEsUUFBcUNDLENBQXJDO0FBQUEsUUFBd0NDLENBQXhDO0FBQUEsUUFBMkNDLEdBQTNDO0FBQUEsUUFBZ0QvRSxPQUFPLENBQUMwRSxTQUFTLENBQVQsR0FBYSxDQUFkLEtBQW9CQSxTQUFTLENBQVQsR0FBYSxDQUFqQyxDQUF2RDs7QUFFQTtBQUNBLFNBQU03QixJQUFJLENBQVYsRUFBYUEsS0FBSzZCLE1BQWxCLEVBQTBCN0IsR0FBMUIsRUFBK0I7QUFDM0IsYUFBTUMsSUFBSSxDQUFWLEVBQWFBLElBQUlULEtBQWpCLEVBQXdCUyxHQUF4QixFQUE2QjtBQUN6QkcsdUJBQWFKLENBQUQsR0FBTVIsS0FBUCxHQUFnQlMsQ0FBM0IsSUFBZ0MsQ0FBaEM7QUFDQUcsdUJBQVksQ0FBRVgsU0FBUyxDQUFWLEdBQWVPLENBQWhCLElBQXFCUixLQUF0QixHQUErQlMsQ0FBMUMsSUFBK0MsQ0FBL0M7QUFDSDtBQUNKOztBQUVEO0FBQ0EsU0FBTUQsSUFBSTZCLE1BQVYsRUFBa0I3QixJQUFJUCxTQUFTb0MsTUFBL0IsRUFBdUM3QixHQUF2QyxFQUE0QztBQUN4QyxhQUFNQyxJQUFJLENBQVYsRUFBYUEsS0FBSzRCLE1BQWxCLEVBQTBCNUIsR0FBMUIsRUFBK0I7QUFDM0JHLHVCQUFhSixDQUFELEdBQU1SLEtBQVAsR0FBZ0JTLENBQTNCLElBQWdDLENBQWhDO0FBQ0FHLHVCQUFhSixDQUFELEdBQU1SLEtBQVAsSUFBaUJBLFFBQVEsQ0FBUixHQUFZUyxDQUE3QixDQUFYLElBQThDLENBQTlDO0FBQ0g7QUFDSjs7QUFFRCxTQUFNRCxJQUFJNkIsU0FBUyxDQUFuQixFQUFzQjdCLElBQUlQLFNBQVNvQyxNQUFULEdBQWtCLENBQTVDLEVBQStDN0IsR0FBL0MsRUFBb0Q7QUFDaEQsYUFBTUMsSUFBSTRCLFNBQVMsQ0FBbkIsRUFBc0I1QixJQUFJVCxRQUFRcUMsTUFBbEMsRUFBMEM1QixHQUExQyxFQUErQztBQUMzQzZCLGdCQUFJcEMsa0JBQWtCLENBQUNNLElBQUk2QixNQUFKLEdBQWEsQ0FBZCxJQUFtQnJDLEtBQW5CLElBQTRCUyxJQUFJNEIsTUFBSixHQUFhLENBQXpDLENBQWxCLENBQUo7QUFDQUUsZ0JBQUlyQyxrQkFBa0IsQ0FBQ00sSUFBSTZCLE1BQUosR0FBYSxDQUFkLElBQW1CckMsS0FBbkIsSUFBNEJTLElBQUk0QixNQUFoQyxDQUFsQixDQUFKO0FBQ0FHLGdCQUFJdEMsa0JBQWtCLENBQUNNLElBQUk2QixNQUFMLElBQWVyQyxLQUFmLElBQXdCUyxJQUFJNEIsTUFBSixHQUFhLENBQXJDLENBQWxCLENBQUo7QUFDQUksZ0JBQUl2QyxrQkFBa0IsQ0FBQ00sSUFBSTZCLE1BQUwsSUFBZXJDLEtBQWYsSUFBd0JTLElBQUk0QixNQUE1QixDQUFsQixDQUFKO0FBQ0EvTCxrQkFBTW1NLElBQUlELENBQUosR0FBUUQsQ0FBUixHQUFZRCxDQUFsQjtBQUNBSSxrQkFBTXBNLE1BQU9xSCxJQUFiO0FBQ0FpRCx1QkFBV0osSUFBSVIsS0FBSixHQUFZUyxDQUF2QixJQUE0QjVCLFVBQVUyQixJQUFJUixLQUFKLEdBQVlTLENBQXRCLElBQTRCaUMsTUFBTSxDQUFsQyxHQUF1QyxDQUF2QyxHQUEyQyxDQUF2RTtBQUNIO0FBQ0o7QUFDSjs7QUFFTSxTQUFTQyxPQUFULENBQWlCQyxNQUFqQixFQUF5QnRJLFNBQXpCLEVBQW9DdUksUUFBcEMsRUFBOEM7QUFDakQsUUFBSWhOLENBQUo7QUFBQSxRQUFPa00sQ0FBUDtBQUFBLFFBQVVZLE9BQVY7QUFBQSxRQUFtQkcsS0FBbkI7QUFBQSxRQUEwQkMsV0FBVyxFQUFyQzs7QUFFQSxRQUFJLENBQUNGLFFBQUwsRUFBZTtBQUNYQSxtQkFBVyxLQUFYO0FBQ0g7O0FBRUQsYUFBU0csWUFBVCxDQUFzQkMsUUFBdEIsRUFBZ0M7QUFDNUIsWUFBSUMsUUFBUSxLQUFaO0FBQ0EsYUFBTW5CLElBQUksQ0FBVixFQUFhQSxJQUFJZ0IsU0FBU2hOLE1BQTFCLEVBQWtDZ00sR0FBbEMsRUFBdUM7QUFDbkNZLHNCQUFVSSxTQUFTaEIsQ0FBVCxDQUFWO0FBQ0EsZ0JBQUlZLFFBQVFRLElBQVIsQ0FBYUYsUUFBYixDQUFKLEVBQTRCO0FBQ3hCTix3QkFBUVMsR0FBUixDQUFZSCxRQUFaO0FBQ0FDLHdCQUFRLElBQVI7QUFDSDtBQUNKO0FBQ0QsZUFBT0EsS0FBUDtBQUNIOztBQUVEO0FBQ0EsU0FBTXJOLElBQUksQ0FBVixFQUFhQSxJQUFJK00sT0FBTzdNLE1BQXhCLEVBQWdDRixHQUFoQyxFQUFxQztBQUNqQ2lOLGdCQUFRLHlEQUFBTyxDQUFTQyxXQUFULENBQXFCVixPQUFPL00sQ0FBUCxDQUFyQixFQUFnQ0EsQ0FBaEMsRUFBbUNnTixRQUFuQyxDQUFSO0FBQ0EsWUFBSSxDQUFDRyxhQUFhRixLQUFiLENBQUwsRUFBMEI7QUFDdEJDLHFCQUFTbEwsSUFBVCxDQUFjLHlEQUFBd0wsQ0FBU3ZILE1BQVQsQ0FBZ0JnSCxLQUFoQixFQUF1QnhJLFNBQXZCLENBQWQ7QUFDSDtBQUNKO0FBQ0QsV0FBT3lJLFFBQVA7QUFDSDs7QUFFTSxJQUFNUSxTQUFTO0FBQ2xCQyxXQUFPLGVBQVNaLE1BQVQsRUFBaUJhLEdBQWpCLEVBQXNCO0FBQ3pCLFlBQUlDLFNBQUo7QUFBQSxZQUFlQyxnQkFBZ0IsRUFBL0I7QUFBQSxZQUFtQ0MsTUFBTSxFQUF6QztBQUFBLFlBQTZDM0wsU0FBUyxFQUF0RDtBQUFBLFlBQTBENEwsWUFBWSxDQUF0RTtBQUFBLFlBQXlFQyxhQUFhLENBQXRGOztBQUVBLGlCQUFTTixLQUFULENBQWVPLEdBQWYsRUFBb0JDLE9BQXBCLEVBQTZCO0FBQ3pCLGdCQUFJQyxJQUFKO0FBQUEsZ0JBQVVDLEVBQVY7QUFBQSxnQkFBY0MsS0FBZDtBQUFBLGdCQUFxQkMsWUFBckI7QUFBQSxnQkFBbUNDLGFBQWEsQ0FBaEQ7QUFBQSxnQkFBbURDLGFBQWF4TixLQUFLQyxHQUFMLENBQVMwTSxJQUFJLENBQUosSUFBUyxFQUFsQixDQUFoRTtBQUFBLGdCQUF1RlAsUUFBUSxLQUEvRjs7QUFFQSxxQkFBU3FCLEtBQVQsQ0FBZTdHLEdBQWYsRUFBb0I4RyxTQUFwQixFQUErQjtBQUMzQixvQkFBSTlHLElBQUkzRCxDQUFKLEdBQVN5SyxVQUFVekssQ0FBVixHQUFjc0ssVUFBdkIsSUFDTzNHLElBQUkzRCxDQUFKLEdBQVN5SyxVQUFVekssQ0FBVixHQUFjc0ssVUFEOUIsSUFFTzNHLElBQUlVLENBQUosR0FBU29HLFVBQVVwRyxDQUFWLEdBQWNrRyxVQUY5QixJQUdPNUcsSUFBSVUsQ0FBSixHQUFTb0csVUFBVXBHLENBQVYsR0FBY2tHLFVBSGxDLEVBRytDO0FBQzNDLDJCQUFPLElBQVA7QUFDSCxpQkFMRCxNQUtPO0FBQ0gsMkJBQU8sS0FBUDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTs7QUFFQUwsbUJBQU9yQixPQUFPbUIsR0FBUCxDQUFQO0FBQ0EsZ0JBQUlDLE9BQUosRUFBYTtBQUNUSSwrQkFBZTtBQUNYckssdUJBQUdrSyxLQUFLbEssQ0FBTCxHQUFTMEosSUFBSSxDQUFKLENBREQ7QUFFWHJGLHVCQUFHNkYsS0FBSzdGLENBQUwsR0FBU3FGLElBQUksQ0FBSjtBQUZELGlCQUFmO0FBSUgsYUFMRCxNQUtPO0FBQ0hXLCtCQUFlO0FBQ1hySyx1QkFBR2tLLEtBQUtsSyxDQUFMLEdBQVMwSixJQUFJLENBQUosQ0FERDtBQUVYckYsdUJBQUc2RixLQUFLN0YsQ0FBTCxHQUFTcUYsSUFBSSxDQUFKO0FBRkQsaUJBQWY7QUFJSDs7QUFFRFUsb0JBQVFILFVBQVVELE1BQU0sQ0FBaEIsR0FBb0JBLE1BQU0sQ0FBbEM7QUFDQUcsaUJBQUt0QixPQUFPdUIsS0FBUCxDQUFMO0FBQ0EsbUJBQU9ELE1BQU0sQ0FBRWhCLFFBQVFxQixNQUFNTCxFQUFOLEVBQVVFLFlBQVYsQ0FBVixNQUF1QyxJQUE3QyxJQUFzRHROLEtBQUtDLEdBQUwsQ0FBU21OLEdBQUc5RixDQUFILEdBQU82RixLQUFLN0YsQ0FBckIsSUFBMEJxRixJQUFJLENBQUosQ0FBdkYsRUFBZ0c7QUFDNUZVLHdCQUFRSCxVQUFVRyxRQUFRLENBQWxCLEdBQXNCQSxRQUFRLENBQXRDO0FBQ0FELHFCQUFLdEIsT0FBT3VCLEtBQVAsQ0FBTDtBQUNIOztBQUVELG1CQUFPakIsUUFBUWlCLEtBQVIsR0FBZ0IsSUFBdkI7QUFDSDs7QUFFRCxhQUFNVCxZQUFZLENBQWxCLEVBQXFCQSxZQUFZQyxhQUFqQyxFQUFnREQsV0FBaEQsRUFBNkQ7QUFDekQ7QUFDQUcsd0JBQVkvTSxLQUFLa0QsS0FBTCxDQUFXbEQsS0FBS21ELE1BQUwsS0FBZ0IySSxPQUFPN00sTUFBbEMsQ0FBWjs7QUFFQTtBQUNBNk4sa0JBQU0sRUFBTjtBQUNBRSx5QkFBYUQsU0FBYjtBQUNBRCxnQkFBSS9MLElBQUosQ0FBUytLLE9BQU9rQixVQUFQLENBQVQ7QUFDQSxtQkFBTyxDQUFFQSxhQUFhTixNQUFNTSxVQUFOLEVBQWtCLElBQWxCLENBQWYsTUFBNEMsSUFBbkQsRUFBeUQ7QUFDckRGLG9CQUFJL0wsSUFBSixDQUFTK0ssT0FBT2tCLFVBQVAsQ0FBVDtBQUNIO0FBQ0QsZ0JBQUlELFlBQVksQ0FBaEIsRUFBbUI7QUFDZkMsNkJBQWFELFNBQWI7QUFDQSx1QkFBTyxDQUFFQyxhQUFhTixNQUFNTSxVQUFOLEVBQWtCLEtBQWxCLENBQWYsTUFBNkMsSUFBcEQsRUFBMEQ7QUFDdERGLHdCQUFJL0wsSUFBSixDQUFTK0ssT0FBT2tCLFVBQVAsQ0FBVDtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUlGLElBQUk3TixNQUFKLEdBQWFrQyxPQUFPbEMsTUFBeEIsRUFBZ0M7QUFDNUJrQyx5QkFBUzJMLEdBQVQ7QUFDSDtBQUNKO0FBQ0QsZUFBTzNMLE1BQVA7QUFDSDtBQW5FaUIsQ0FBZjs7QUFzRUEsSUFBTXdNLFNBQVMsQ0FBZjtBQUNBLElBQU1DLFFBQVEsQ0FBZDs7QUFFQSxTQUFTQyxNQUFULENBQWdCQyxjQUFoQixFQUFnQ0MsZUFBaEMsRUFBaUQ7QUFDcEQsUUFBSXJFLENBQUo7QUFBQSxRQUNJQyxDQURKO0FBQUEsUUFFSXFFLGNBQWNGLGVBQWU1RixJQUZqQztBQUFBLFFBR0krRixlQUFlRixnQkFBZ0I3RixJQUhuQztBQUFBLFFBSUlpQixTQUFTMkUsZUFBZWpILElBQWYsQ0FBb0JTLENBSmpDO0FBQUEsUUFLSTRCLFFBQVE0RSxlQUFlakgsSUFBZixDQUFvQjVELENBTGhDO0FBQUEsUUFNSXpELEdBTko7QUFBQSxRQU9JME8sT0FQSjtBQUFBLFFBUUlDLE9BUko7QUFBQSxRQVNJQyxPQVRKO0FBQUEsUUFVSUMsT0FWSjs7QUFZQSxTQUFNM0UsSUFBSSxDQUFWLEVBQWFBLElBQUlQLFNBQVMsQ0FBMUIsRUFBNkJPLEdBQTdCLEVBQWtDO0FBQzlCLGFBQU1DLElBQUksQ0FBVixFQUFhQSxJQUFJVCxRQUFRLENBQXpCLEVBQTRCUyxHQUE1QixFQUFpQztBQUM3QnVFLHNCQUFVeEUsSUFBSSxDQUFkO0FBQ0F5RSxzQkFBVXpFLElBQUksQ0FBZDtBQUNBMEUsc0JBQVV6RSxJQUFJLENBQWQ7QUFDQTBFLHNCQUFVMUUsSUFBSSxDQUFkO0FBQ0FuSyxrQkFBTXdPLFlBQVlFLFVBQVVoRixLQUFWLEdBQWtCa0YsT0FBOUIsSUFBeUNKLFlBQVlFLFVBQVVoRixLQUFWLEdBQWtCbUYsT0FBOUIsQ0FBekMsR0FDTkwsWUFBWXRFLElBQUlSLEtBQUosR0FBWVMsQ0FBeEIsQ0FETSxHQUVOcUUsWUFBWUcsVUFBVWpGLEtBQVYsR0FBa0JrRixPQUE5QixDQUZNLEdBRW1DSixZQUFZRyxVQUFVakYsS0FBVixHQUFrQm1GLE9BQTlCLENBRnpDO0FBR0FKLHlCQUFhdkUsSUFBSVIsS0FBSixHQUFZUyxDQUF6QixJQUE4Qm5LLE1BQU0sQ0FBTixHQUFVLENBQVYsR0FBYyxDQUE1QztBQUNIO0FBQ0o7QUFDSjs7QUFFTSxTQUFTOE8sS0FBVCxDQUFlUixjQUFmLEVBQStCQyxlQUEvQixFQUFnRDtBQUNuRCxRQUFJckUsQ0FBSjtBQUFBLFFBQ0lDLENBREo7QUFBQSxRQUVJcUUsY0FBY0YsZUFBZTVGLElBRmpDO0FBQUEsUUFHSStGLGVBQWVGLGdCQUFnQjdGLElBSG5DO0FBQUEsUUFJSWlCLFNBQVMyRSxlQUFlakgsSUFBZixDQUFvQlMsQ0FKakM7QUFBQSxRQUtJNEIsUUFBUTRFLGVBQWVqSCxJQUFmLENBQW9CNUQsQ0FMaEM7QUFBQSxRQU1JekQsR0FOSjtBQUFBLFFBT0kwTyxPQVBKO0FBQUEsUUFRSUMsT0FSSjtBQUFBLFFBU0lDLE9BVEo7QUFBQSxRQVVJQyxPQVZKOztBQVlBLFNBQU0zRSxJQUFJLENBQVYsRUFBYUEsSUFBSVAsU0FBUyxDQUExQixFQUE2Qk8sR0FBN0IsRUFBa0M7QUFDOUIsYUFBTUMsSUFBSSxDQUFWLEVBQWFBLElBQUlULFFBQVEsQ0FBekIsRUFBNEJTLEdBQTVCLEVBQWlDO0FBQzdCdUUsc0JBQVV4RSxJQUFJLENBQWQ7QUFDQXlFLHNCQUFVekUsSUFBSSxDQUFkO0FBQ0EwRSxzQkFBVXpFLElBQUksQ0FBZDtBQUNBMEUsc0JBQVUxRSxJQUFJLENBQWQ7QUFDQW5LLGtCQUFNd08sWUFBWUUsVUFBVWhGLEtBQVYsR0FBa0JrRixPQUE5QixJQUF5Q0osWUFBWUUsVUFBVWhGLEtBQVYsR0FBa0JtRixPQUE5QixDQUF6QyxHQUNOTCxZQUFZdEUsSUFBSVIsS0FBSixHQUFZUyxDQUF4QixDQURNLEdBRU5xRSxZQUFZRyxVQUFVakYsS0FBVixHQUFrQmtGLE9BQTlCLENBRk0sR0FFbUNKLFlBQVlHLFVBQVVqRixLQUFWLEdBQWtCbUYsT0FBOUIsQ0FGekM7QUFHQUoseUJBQWF2RSxJQUFJUixLQUFKLEdBQVlTLENBQXpCLElBQThCbkssUUFBUSxDQUFSLEdBQVksQ0FBWixHQUFnQixDQUE5QztBQUNIO0FBQ0o7QUFDSjs7QUFFTSxTQUFTK08sUUFBVCxDQUFrQkMsYUFBbEIsRUFBaUNDLGFBQWpDLEVBQWdEQyxrQkFBaEQsRUFBb0U7QUFDdkUsUUFBSSxDQUFDQSxrQkFBTCxFQUF5QjtBQUNyQkEsNkJBQXFCRixhQUFyQjtBQUNIO0FBQ0QsUUFBSXZQLFNBQVN1UCxjQUFjdEcsSUFBZCxDQUFtQmpKLE1BQWhDO0FBQUEsUUFDSTBQLGFBQWFILGNBQWN0RyxJQUQvQjtBQUFBLFFBRUkwRyxhQUFhSCxjQUFjdkcsSUFGL0I7QUFBQSxRQUdJMkcsYUFBYUgsbUJBQW1CeEcsSUFIcEM7O0FBS0EsV0FBT2pKLFFBQVAsRUFBaUI7QUFDYjRQLG1CQUFXNVAsTUFBWCxJQUFxQjBQLFdBQVcxUCxNQUFYLElBQXFCMlAsV0FBVzNQLE1BQVgsQ0FBMUM7QUFDSDtBQUNKOztBQUVNLFNBQVM2UCxTQUFULENBQW1CTixhQUFuQixFQUFrQ0MsYUFBbEMsRUFBaURDLGtCQUFqRCxFQUFxRTtBQUN4RSxRQUFJLENBQUNBLGtCQUFMLEVBQXlCO0FBQ3JCQSw2QkFBcUJGLGFBQXJCO0FBQ0g7QUFDRCxRQUFJdlAsU0FBU3VQLGNBQWN0RyxJQUFkLENBQW1CakosTUFBaEM7QUFBQSxRQUNJMFAsYUFBYUgsY0FBY3RHLElBRC9CO0FBQUEsUUFFSTBHLGFBQWFILGNBQWN2RyxJQUYvQjtBQUFBLFFBR0kyRyxhQUFhSCxtQkFBbUJ4RyxJQUhwQzs7QUFLQSxXQUFPakosUUFBUCxFQUFpQjtBQUNiNFAsbUJBQVc1UCxNQUFYLElBQXFCMFAsV0FBVzFQLE1BQVgsS0FBc0IyUCxXQUFXM1AsTUFBWCxDQUEzQztBQUNIO0FBQ0o7O0FBRU0sU0FBUzhQLFlBQVQsQ0FBc0IvRixZQUF0QixFQUFvQztBQUN2QyxRQUFJL0osU0FBUytKLGFBQWFkLElBQWIsQ0FBa0JqSixNQUEvQjtBQUFBLFFBQXVDaUosT0FBT2MsYUFBYWQsSUFBM0Q7QUFBQSxRQUFpRTFJLE1BQU0sQ0FBdkU7O0FBRUEsV0FBT1AsUUFBUCxFQUFpQjtBQUNiTyxlQUFPMEksS0FBS2pKLE1BQUwsQ0FBUDtBQUNIO0FBQ0QsV0FBT08sR0FBUDtBQUNIOztBQUVNLFNBQVN3UCxVQUFULENBQW9CQyxJQUFwQixFQUEwQm5DLEdBQTFCLEVBQStCckosU0FBL0IsRUFBMEM7QUFDN0MsUUFBSTFFLENBQUo7QUFBQSxRQUFPbVEsU0FBUyxDQUFoQjtBQUFBLFFBQW1CQyxNQUFNLENBQXpCO0FBQUEsUUFBNEJ6TCxRQUFRLEVBQXBDO0FBQUEsUUFBd0MwTCxLQUF4QztBQUFBLFFBQStDQyxHQUEvQztBQUFBLFFBQW9EekksR0FBcEQ7O0FBRUEsU0FBTTdILElBQUksQ0FBVixFQUFhQSxJQUFJK04sR0FBakIsRUFBc0IvTixHQUF0QixFQUEyQjtBQUN2QjJFLGNBQU0zRSxDQUFOLElBQVc7QUFDUHFRLG1CQUFPLENBREE7QUFFUEUsa0JBQU07QUFGQyxTQUFYO0FBSUg7O0FBRUQsU0FBTXZRLElBQUksQ0FBVixFQUFhQSxJQUFJa1EsS0FBS2hRLE1BQXRCLEVBQThCRixHQUE5QixFQUFtQztBQUMvQnFRLGdCQUFRM0wsVUFBVUUsS0FBVixDQUFnQixJQUFoQixFQUFzQixDQUFDc0wsS0FBS2xRLENBQUwsQ0FBRCxDQUF0QixDQUFSO0FBQ0EsWUFBSXFRLFFBQVFELEdBQVosRUFBaUI7QUFDYkUsa0JBQU0zTCxNQUFNd0wsTUFBTixDQUFOO0FBQ0FHLGdCQUFJRCxLQUFKLEdBQVlBLEtBQVo7QUFDQUMsZ0JBQUlDLElBQUosR0FBV0wsS0FBS2xRLENBQUwsQ0FBWDtBQUNBb1Esa0JBQU1yUCxPQUFPQyxTQUFiO0FBQ0EsaUJBQU02RyxNQUFNLENBQVosRUFBZUEsTUFBTWtHLEdBQXJCLEVBQTBCbEcsS0FBMUIsRUFBaUM7QUFDN0Isb0JBQUlsRCxNQUFNa0QsR0FBTixFQUFXd0ksS0FBWCxHQUFtQkQsR0FBdkIsRUFBNEI7QUFDeEJBLDBCQUFNekwsTUFBTWtELEdBQU4sRUFBV3dJLEtBQWpCO0FBQ0FGLDZCQUFTdEksR0FBVDtBQUNIO0FBQ0o7QUFDSjtBQUNKOztBQUVELFdBQU9sRCxLQUFQO0FBQ0g7O0FBRU0sU0FBUzZMLGtCQUFULENBQTRCQyxTQUE1QixFQUF1Q0MsT0FBdkMsRUFBZ0QzSSxHQUFoRCxFQUFxRDRJLEtBQXJELEVBQTREO0FBQy9ENUksUUFBSWdCLFNBQUosQ0FBYzBILFNBQWQsRUFBeUJDLE9BQXpCLEVBQWtDLENBQWxDLEVBQXFDRCxVQUFVdEcsS0FBL0MsRUFBc0RzRyxVQUFVckcsTUFBaEU7QUFDQSxRQUFJd0csVUFBVTdJLElBQUltQixZQUFKLENBQWlCd0gsT0FBakIsRUFBMEIsQ0FBMUIsRUFBNkJELFVBQVV0RyxLQUF2QyxFQUE4Q3NHLFVBQVVyRyxNQUF4RCxFQUFnRWpCLElBQTlFO0FBQ0EwSCxnQkFBWUQsT0FBWixFQUFxQkQsS0FBckI7QUFDSDs7QUFFTSxTQUFTRyxvQkFBVCxDQUE4Qi9JLEdBQTlCLEVBQW1DRCxJQUFuQyxFQUF5QzFHLE1BQXpDLEVBQWlEdVAsS0FBakQsRUFBd0Q7QUFDM0QsUUFBSUMsVUFBVTdJLElBQUltQixZQUFKLENBQWlCOUgsT0FBTzhDLENBQXhCLEVBQTJCOUMsT0FBT21ILENBQWxDLEVBQXFDVCxLQUFLNUQsQ0FBMUMsRUFBNkM0RCxLQUFLUyxDQUFsRCxFQUFxRFksSUFBbkU7QUFDQTBILGdCQUFZRCxPQUFaLEVBQXFCRCxLQUFyQjtBQUNIOztBQUVNLFNBQVNJLCtCQUFULENBQXlDOUgsVUFBekMsRUFBcURuQixJQUFyRCxFQUEyRGtKLFFBQTNELEVBQXFFO0FBQ3hFLFFBQUlDLFlBQVksQ0FBaEI7QUFDQSxRQUFJQyxlQUFlcEosS0FBSzVELENBQXhCO0FBQ0EsUUFBSWlOLFNBQVNsUSxLQUFLa0QsS0FBTCxDQUFXOEUsV0FBVy9JLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBYjtBQUNBLFFBQUlrUixXQUFXdEosS0FBSzVELENBQUwsR0FBUyxDQUF4QjtBQUNBLFFBQUltTixZQUFZLENBQWhCO0FBQ0EsUUFBSUMsVUFBVXhKLEtBQUs1RCxDQUFuQjtBQUNBLFFBQUlsRSxDQUFKOztBQUVBLFdBQU9rUixlQUFlQyxNQUF0QixFQUE4QjtBQUMxQixhQUFNblIsSUFBSSxDQUFWLEVBQWFBLElBQUlvUixRQUFqQixFQUEyQnBSLEdBQTNCLEVBQWdDO0FBQzVCZ1IscUJBQVNLLFNBQVQsSUFBc0IsQ0FDakIsUUFBUXBJLFdBQVdnSSxZQUFZLENBQVosR0FBZ0IsQ0FBM0IsQ0FBUixHQUNBLFFBQVFoSSxXQUFXZ0ksWUFBWSxDQUFaLEdBQWdCLENBQTNCLENBRFIsR0FFQSxRQUFRaEksV0FBV2dJLFlBQVksQ0FBWixHQUFnQixDQUEzQixDQUZULElBR0MsUUFBUWhJLFdBQVcsQ0FBQ2dJLFlBQVksQ0FBYixJQUFrQixDQUFsQixHQUFzQixDQUFqQyxDQUFSLEdBQ0EsUUFBUWhJLFdBQVcsQ0FBQ2dJLFlBQVksQ0FBYixJQUFrQixDQUFsQixHQUFzQixDQUFqQyxDQURSLEdBRUEsUUFBUWhJLFdBQVcsQ0FBQ2dJLFlBQVksQ0FBYixJQUFrQixDQUFsQixHQUFzQixDQUFqQyxDQUxULEtBTUMsUUFBUWhJLFdBQVlpSSxZQUFELEdBQWlCLENBQWpCLEdBQXFCLENBQWhDLENBQVIsR0FDQSxRQUFRakksV0FBWWlJLFlBQUQsR0FBaUIsQ0FBakIsR0FBcUIsQ0FBaEMsQ0FEUixHQUVBLFFBQVFqSSxXQUFZaUksWUFBRCxHQUFpQixDQUFqQixHQUFxQixDQUFoQyxDQVJULEtBU0MsUUFBUWpJLFdBQVcsQ0FBQ2lJLGVBQWUsQ0FBaEIsSUFBcUIsQ0FBckIsR0FBeUIsQ0FBcEMsQ0FBUixHQUNBLFFBQVFqSSxXQUFXLENBQUNpSSxlQUFlLENBQWhCLElBQXFCLENBQXJCLEdBQXlCLENBQXBDLENBRFIsR0FFQSxRQUFRakksV0FBVyxDQUFDaUksZUFBZSxDQUFoQixJQUFxQixDQUFyQixHQUF5QixDQUFwQyxDQVhULENBRGtCLElBWWtDLENBWnhEO0FBYUFHO0FBQ0FKLHdCQUFZQSxZQUFZLENBQXhCO0FBQ0FDLDJCQUFlQSxlQUFlLENBQTlCO0FBQ0g7QUFDREQsb0JBQVlBLFlBQVlLLE9BQXhCO0FBQ0FKLHVCQUFlQSxlQUFlSSxPQUE5QjtBQUNIO0FBQ0o7O0FBRU0sU0FBU1QsV0FBVCxDQUFxQjdILFNBQXJCLEVBQWdDZ0ksUUFBaEMsRUFBMEN2UixNQUExQyxFQUFrRDtBQUNyRCxRQUFJc0UsSUFBS2lGLFVBQVU5SSxNQUFWLEdBQW1CLENBQXBCLEdBQXlCLENBQWpDO0FBQUEsUUFDSUYsQ0FESjtBQUFBLFFBRUl1UixnQkFBZ0I5UixVQUFVQSxPQUFPOFIsYUFBUCxLQUF5QixJQUZ2RDs7QUFJQSxRQUFJQSxhQUFKLEVBQW1CO0FBQ2YsYUFBS3ZSLElBQUksQ0FBVCxFQUFZQSxJQUFJK0QsQ0FBaEIsRUFBbUIvRCxHQUFuQixFQUF3QjtBQUNwQmdSLHFCQUFTaFIsQ0FBVCxJQUFjZ0osVUFBVWhKLElBQUksQ0FBSixHQUFRLENBQWxCLENBQWQ7QUFDSDtBQUNKLEtBSkQsTUFJTztBQUNILGFBQUtBLElBQUksQ0FBVCxFQUFZQSxJQUFJK0QsQ0FBaEIsRUFBbUIvRCxHQUFuQixFQUF3QjtBQUNwQmdSLHFCQUFTaFIsQ0FBVCxJQUNJLFFBQVFnSixVQUFVaEosSUFBSSxDQUFKLEdBQVEsQ0FBbEIsQ0FBUixHQUErQixRQUFRZ0osVUFBVWhKLElBQUksQ0FBSixHQUFRLENBQWxCLENBQXZDLEdBQThELFFBQVFnSixVQUFVaEosSUFBSSxDQUFKLEdBQVEsQ0FBbEIsQ0FEMUU7QUFFSDtBQUNKO0FBQ0o7O0FBRU0sU0FBU3dSLGNBQVQsQ0FBd0JDLEdBQXhCLEVBQTZCQyxRQUE3QixFQUF1Q0MsTUFBdkMsRUFBK0M7QUFDbEQsUUFBSSxDQUFDQSxNQUFMLEVBQWE7QUFDVEEsaUJBQVNDLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBVDtBQUNIO0FBQ0QsUUFBSUMsTUFBTSxJQUFJQyxLQUFKLEVBQVY7QUFDQUQsUUFBSUosUUFBSixHQUFlQSxRQUFmO0FBQ0FJLFFBQUlFLE1BQUosR0FBYSxZQUFXO0FBQ3BCTCxlQUFPeEgsS0FBUCxHQUFlLEtBQUtBLEtBQXBCO0FBQ0F3SCxlQUFPdkgsTUFBUCxHQUFnQixLQUFLQSxNQUFyQjtBQUNBLFlBQUlyQyxNQUFNNEosT0FBT00sVUFBUCxDQUFrQixJQUFsQixDQUFWO0FBQ0FsSyxZQUFJZ0IsU0FBSixDQUFjLElBQWQsRUFBb0IsQ0FBcEIsRUFBdUIsQ0FBdkI7QUFDQSxZQUFJNEgsUUFBUSxJQUFJdUIsVUFBSixDQUFlLEtBQUsvSCxLQUFMLEdBQWEsS0FBS0MsTUFBakMsQ0FBWjtBQUNBckMsWUFBSWdCLFNBQUosQ0FBYyxJQUFkLEVBQW9CLENBQXBCLEVBQXVCLENBQXZCO0FBQ0EsWUFBSUksT0FBT3BCLElBQUltQixZQUFKLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLEVBQXVCLEtBQUtpQixLQUE1QixFQUFtQyxLQUFLQyxNQUF4QyxFQUFnRGpCLElBQTNEO0FBQ0EwSCxvQkFBWTFILElBQVosRUFBa0J3SCxLQUFsQjtBQUNBLGFBQUtlLFFBQUwsQ0FBY2YsS0FBZCxFQUFxQjtBQUNqQnpNLGVBQUcsS0FBS2lHLEtBRFM7QUFFakI1QixlQUFHLEtBQUs2QjtBQUZTLFNBQXJCLEVBR0csSUFISDtBQUlILEtBYkQ7QUFjQTBILFFBQUlMLEdBQUosR0FBVUEsR0FBVjtBQUNIOztBQUVEOzs7O0FBSU8sU0FBU1UsVUFBVCxDQUFvQkMsWUFBcEIsRUFBa0NDLGFBQWxDLEVBQWlEO0FBQ3BELFFBQUlDLFFBQVFGLGFBQWFqSixJQUF6QjtBQUNBLFFBQUltSSxVQUFVYyxhQUFhdEssSUFBYixDQUFrQjVELENBQWhDO0FBQ0EsUUFBSXFPLFNBQVNGLGNBQWNsSixJQUEzQjtBQUNBLFFBQUk4SCxZQUFZLENBQWhCO0FBQ0EsUUFBSUMsZUFBZUksT0FBbkI7QUFDQSxRQUFJSCxTQUFTbUIsTUFBTXBTLE1BQW5CO0FBQ0EsUUFBSWtSLFdBQVdFLFVBQVUsQ0FBekI7QUFDQSxRQUFJRCxZQUFZLENBQWhCO0FBQ0EsV0FBT0gsZUFBZUMsTUFBdEIsRUFBOEI7QUFDMUIsYUFBSyxJQUFJblIsSUFBSSxDQUFiLEVBQWdCQSxJQUFJb1IsUUFBcEIsRUFBOEJwUixHQUE5QixFQUFtQztBQUMvQnVTLG1CQUFPbEIsU0FBUCxJQUFvQnBRLEtBQUtrRCxLQUFMLENBQ2hCLENBQUNtTyxNQUFNckIsU0FBTixJQUFtQnFCLE1BQU1yQixZQUFZLENBQWxCLENBQW5CLEdBQTBDcUIsTUFBTXBCLFlBQU4sQ0FBMUMsR0FBZ0VvQixNQUFNcEIsZUFBZSxDQUFyQixDQUFqRSxJQUE0RixDQUQ1RSxDQUFwQjtBQUVBRztBQUNBSix3QkFBWUEsWUFBWSxDQUF4QjtBQUNBQywyQkFBZUEsZUFBZSxDQUE5QjtBQUNIO0FBQ0RELG9CQUFZQSxZQUFZSyxPQUF4QjtBQUNBSix1QkFBZUEsZUFBZUksT0FBOUI7QUFDSDtBQUNKOztBQUVNLFNBQVNrQixPQUFULENBQWlCQyxHQUFqQixFQUFzQkMsR0FBdEIsRUFBMkI7QUFDOUIsUUFBSUMsSUFBSUYsSUFBSSxDQUFKLENBQVI7QUFBQSxRQUNJRyxJQUFJSCxJQUFJLENBQUosQ0FEUjtBQUFBLFFBRUk5SCxJQUFJOEgsSUFBSSxDQUFKLENBRlI7QUFBQSxRQUdJSSxJQUFJbEksSUFBSWlJLENBSFo7QUFBQSxRQUlJMU8sSUFBSTJPLEtBQUssSUFBSTVSLEtBQUtDLEdBQUwsQ0FBVXlSLElBQUksRUFBTCxHQUFXLENBQVgsR0FBZSxDQUF4QixDQUFULENBSlI7QUFBQSxRQUtJRyxJQUFJbkksSUFBSWtJLENBTFo7QUFBQSxRQU1JRSxJQUFJLENBTlI7QUFBQSxRQU9JQyxJQUFJLENBUFI7QUFBQSxRQVFJQyxJQUFJLENBUlI7O0FBVUFQLFVBQU1BLE9BQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBYjs7QUFFQSxRQUFJQyxJQUFJLEVBQVIsRUFBWTtBQUNSSSxZQUFJRixDQUFKO0FBQ0FHLFlBQUk5TyxDQUFKO0FBQ0gsS0FIRCxNQUdPLElBQUl5TyxJQUFJLEdBQVIsRUFBYTtBQUNoQkksWUFBSTdPLENBQUo7QUFDQThPLFlBQUlILENBQUo7QUFDSCxLQUhNLE1BR0EsSUFBSUYsSUFBSSxHQUFSLEVBQWE7QUFDaEJLLFlBQUlILENBQUo7QUFDQUksWUFBSS9PLENBQUo7QUFDSCxLQUhNLE1BR0EsSUFBSXlPLElBQUksR0FBUixFQUFhO0FBQ2hCSyxZQUFJOU8sQ0FBSjtBQUNBK08sWUFBSUosQ0FBSjtBQUNILEtBSE0sTUFHQSxJQUFJRixJQUFJLEdBQVIsRUFBYTtBQUNoQkksWUFBSTdPLENBQUo7QUFDQStPLFlBQUlKLENBQUo7QUFDSCxLQUhNLE1BR0EsSUFBSUYsSUFBSSxHQUFSLEVBQWE7QUFDaEJJLFlBQUlGLENBQUo7QUFDQUksWUFBSS9PLENBQUo7QUFDSDtBQUNEd08sUUFBSSxDQUFKLElBQVUsQ0FBQ0ssSUFBSUQsQ0FBTCxJQUFVLEdBQVgsR0FBa0IsQ0FBM0I7QUFDQUosUUFBSSxDQUFKLElBQVUsQ0FBQ00sSUFBSUYsQ0FBTCxJQUFVLEdBQVgsR0FBa0IsQ0FBM0I7QUFDQUosUUFBSSxDQUFKLElBQVUsQ0FBQ08sSUFBSUgsQ0FBTCxJQUFVLEdBQVgsR0FBa0IsQ0FBM0I7QUFDQSxXQUFPSixHQUFQO0FBQ0g7O0FBRU0sU0FBU1EsZ0JBQVQsQ0FBMEJDLENBQTFCLEVBQTZCO0FBQ2hDLFFBQUlDLGdCQUFnQixFQUFwQjtBQUFBLFFBQ0lDLFdBQVcsRUFEZjtBQUFBLFFBRUlyVCxDQUZKOztBQUlBLFNBQUtBLElBQUksQ0FBVCxFQUFZQSxJQUFJaUIsS0FBS3FTLElBQUwsQ0FBVUgsQ0FBVixJQUFlLENBQS9CLEVBQWtDblQsR0FBbEMsRUFBdUM7QUFDbkMsWUFBSW1ULElBQUluVCxDQUFKLEtBQVUsQ0FBZCxFQUFpQjtBQUNicVQscUJBQVNyUixJQUFULENBQWNoQyxDQUFkO0FBQ0EsZ0JBQUlBLE1BQU1tVCxJQUFJblQsQ0FBZCxFQUFpQjtBQUNib1QsOEJBQWNqTSxPQUFkLENBQXNCbEcsS0FBS2tELEtBQUwsQ0FBV2dQLElBQUluVCxDQUFmLENBQXRCO0FBQ0g7QUFDSjtBQUNKO0FBQ0QsV0FBT3FULFNBQVNFLE1BQVQsQ0FBZ0JILGFBQWhCLENBQVA7QUFDSDs7QUFFRCxTQUFTSSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLElBQXBDLEVBQTBDO0FBQ3RDLFFBQUkxVCxJQUFJLENBQVI7QUFBQSxRQUNJaUUsSUFBSSxDQURSO0FBQUEsUUFFSTdCLFNBQVMsRUFGYjs7QUFJQSxXQUFPcEMsSUFBSXlULEtBQUt2VCxNQUFULElBQW1CK0QsSUFBSXlQLEtBQUt4VCxNQUFuQyxFQUEyQztBQUN2QyxZQUFJdVQsS0FBS3pULENBQUwsTUFBWTBULEtBQUt6UCxDQUFMLENBQWhCLEVBQXlCO0FBQ3JCN0IsbUJBQU9KLElBQVAsQ0FBWXlSLEtBQUt6VCxDQUFMLENBQVo7QUFDQUE7QUFDQWlFO0FBQ0gsU0FKRCxNQUlPLElBQUl3UCxLQUFLelQsQ0FBTCxJQUFVMFQsS0FBS3pQLENBQUwsQ0FBZCxFQUF1QjtBQUMxQkE7QUFDSCxTQUZNLE1BRUE7QUFDSGpFO0FBQ0g7QUFDSjtBQUNELFdBQU9vQyxNQUFQO0FBQ0g7O0FBRU0sU0FBU3VSLGtCQUFULENBQTRCQyxTQUE1QixFQUF1Q0MsT0FBdkMsRUFBZ0Q7QUFDbkQsUUFBSUMsWUFBWVosaUJBQWlCVyxRQUFRM1AsQ0FBekIsQ0FBaEI7QUFBQSxRQUNJNlAsWUFBWWIsaUJBQWlCVyxRQUFRdEwsQ0FBekIsQ0FEaEI7QUFBQSxRQUVJeUwsV0FBVy9TLEtBQUs2RCxHQUFMLENBQVMrTyxRQUFRM1AsQ0FBakIsRUFBb0IyUCxRQUFRdEwsQ0FBNUIsQ0FGZjtBQUFBLFFBR0kwTCxTQUFTVCxxQkFBcUJNLFNBQXJCLEVBQWdDQyxTQUFoQyxDQUhiO0FBQUEsUUFJSUcsa0JBQWtCLENBQUMsQ0FBRCxFQUFJLEVBQUosRUFBUSxFQUFSLEVBQVksRUFBWixFQUFnQixFQUFoQixFQUFvQixFQUFwQixFQUF3QixFQUF4QixDQUp0QjtBQUFBLFFBS0lDLGlCQUFpQjtBQUNiLG1CQUFXLENBREU7QUFFYixpQkFBUyxDQUZJO0FBR2Isa0JBQVUsQ0FIRztBQUliLGlCQUFTLENBSkk7QUFLYixtQkFBVztBQUxFLEtBTHJCO0FBQUEsUUFZSUMsaUJBQWlCRCxlQUFlUCxTQUFmLEtBQTZCTyxlQUFlRSxNQVpqRTtBQUFBLFFBYUlDLGNBQWNKLGdCQUFnQkUsY0FBaEIsQ0FibEI7QUFBQSxRQWNJRyxtQkFBbUJ0VCxLQUFLa0QsS0FBTCxDQUFXNlAsV0FBV00sV0FBdEIsQ0FkdkI7QUFBQSxRQWVJRSxnQkFmSjs7QUFpQkEsYUFBU0Msd0JBQVQsQ0FBa0NwQixRQUFsQyxFQUE0QztBQUN4QyxZQUFJclQsSUFBSSxDQUFSO0FBQUEsWUFDSXFOLFFBQVFnRyxTQUFTcFMsS0FBS2tELEtBQUwsQ0FBV2tQLFNBQVNuVCxNQUFULEdBQWtCLENBQTdCLENBQVQsQ0FEWjs7QUFHQSxlQUFPRixJQUFLcVQsU0FBU25ULE1BQVQsR0FBa0IsQ0FBdkIsSUFBNkJtVCxTQUFTclQsQ0FBVCxJQUFjdVUsZ0JBQWxELEVBQW9FO0FBQ2hFdlU7QUFDSDtBQUNELFlBQUlBLElBQUksQ0FBUixFQUFXO0FBQ1AsZ0JBQUlpQixLQUFLQyxHQUFMLENBQVNtUyxTQUFTclQsQ0FBVCxJQUFjdVUsZ0JBQXZCLElBQTJDdFQsS0FBS0MsR0FBTCxDQUFTbVMsU0FBU3JULElBQUksQ0FBYixJQUFrQnVVLGdCQUEzQixDQUEvQyxFQUE2RjtBQUN6RmxILHdCQUFRZ0csU0FBU3JULElBQUksQ0FBYixDQUFSO0FBQ0gsYUFGRCxNQUVPO0FBQ0hxTix3QkFBUWdHLFNBQVNyVCxDQUFULENBQVI7QUFDSDtBQUNKO0FBQ0QsWUFBSXVVLG1CQUFtQmxILEtBQW5CLEdBQTJCNkcsZ0JBQWdCRSxpQkFBaUIsQ0FBakMsSUFBc0NGLGdCQUFnQkUsY0FBaEIsQ0FBakUsSUFDQUcsbUJBQW1CbEgsS0FBbkIsR0FBMkI2RyxnQkFBZ0JFLGlCQUFpQixDQUFqQyxJQUFzQ0YsZ0JBQWdCRSxjQUFoQixDQURyRSxFQUN1RztBQUNuRyxtQkFBTyxFQUFDbFEsR0FBR21KLEtBQUosRUFBVzlFLEdBQUc4RSxLQUFkLEVBQVA7QUFDSDtBQUNELGVBQU8sSUFBUDtBQUNIOztBQUVEbUgsdUJBQW1CQyx5QkFBeUJSLE1BQXpCLENBQW5CO0FBQ0EsUUFBSSxDQUFDTyxnQkFBTCxFQUF1QjtBQUNuQkEsMkJBQW1CQyx5QkFBeUJ2QixpQkFBaUJjLFFBQWpCLENBQXpCLENBQW5CO0FBQ0EsWUFBSSxDQUFDUSxnQkFBTCxFQUF1QjtBQUNuQkEsK0JBQW1CQyx5QkFBMEJ2QixpQkFBaUJxQixtQkFBbUJELFdBQXBDLENBQTFCLENBQW5CO0FBQ0g7QUFDSjtBQUNELFdBQU9FLGdCQUFQO0FBQ0g7O0FBRU0sU0FBU0Usd0JBQVQsQ0FBa0M1UixLQUFsQyxFQUF5QztBQUM1QyxRQUFJNlIsWUFBWTtBQUNaN1IsZUFBTzhSLFdBQVc5UixLQUFYLENBREs7QUFFWitSLGNBQU0vUixNQUFNZ1MsT0FBTixDQUFjLEdBQWQsTUFBdUJoUyxNQUFNNUMsTUFBTixHQUFlLENBQXRDLEdBQTBDLEdBQTFDLEdBQWdEO0FBRjFDLEtBQWhCOztBQUtBLFdBQU95VSxTQUFQO0FBQ0g7O0FBRU0sSUFBTUksd0JBQXdCO0FBQ2pDaEgsU0FBSyxhQUFTNEcsU0FBVCxFQUFvQkssT0FBcEIsRUFBNkI7QUFDOUIsWUFBSUwsVUFBVUUsSUFBVixLQUFtQixHQUF2QixFQUE0QjtBQUN4QixtQkFBTzVULEtBQUtrRCxLQUFMLENBQVc2USxRQUFRNUssTUFBUixJQUFrQnVLLFVBQVU3UixLQUFWLEdBQWtCLEdBQXBDLENBQVgsQ0FBUDtBQUNIO0FBQ0osS0FMZ0M7QUFNakMySSxXQUFPLGVBQVNrSixTQUFULEVBQW9CSyxPQUFwQixFQUE2QjtBQUNoQyxZQUFJTCxVQUFVRSxJQUFWLEtBQW1CLEdBQXZCLEVBQTRCO0FBQ3hCLG1CQUFPNVQsS0FBS2tELEtBQUwsQ0FBVzZRLFFBQVE3SyxLQUFSLEdBQWlCNkssUUFBUTdLLEtBQVIsSUFBaUJ3SyxVQUFVN1IsS0FBVixHQUFrQixHQUFuQyxDQUE1QixDQUFQO0FBQ0g7QUFDSixLQVZnQztBQVdqQ21TLFlBQVEsZ0JBQVNOLFNBQVQsRUFBb0JLLE9BQXBCLEVBQTZCO0FBQ2pDLFlBQUlMLFVBQVVFLElBQVYsS0FBbUIsR0FBdkIsRUFBNEI7QUFDeEIsbUJBQU81VCxLQUFLa0QsS0FBTCxDQUFXNlEsUUFBUTVLLE1BQVIsR0FBa0I0SyxRQUFRNUssTUFBUixJQUFrQnVLLFVBQVU3UixLQUFWLEdBQWtCLEdBQXBDLENBQTdCLENBQVA7QUFDSDtBQUNKLEtBZmdDO0FBZ0JqQ3lJLFVBQU0sY0FBU29KLFNBQVQsRUFBb0JLLE9BQXBCLEVBQTZCO0FBQy9CLFlBQUlMLFVBQVVFLElBQVYsS0FBbUIsR0FBdkIsRUFBNEI7QUFDeEIsbUJBQU81VCxLQUFLa0QsS0FBTCxDQUFXNlEsUUFBUTdLLEtBQVIsSUFBaUJ3SyxVQUFVN1IsS0FBVixHQUFrQixHQUFuQyxDQUFYLENBQVA7QUFDSDtBQUNKO0FBcEJnQyxDQUE5Qjs7QUF1QkEsU0FBU29TLGdCQUFULENBQTBCQyxVQUExQixFQUFzQ0MsV0FBdEMsRUFBbURDLElBQW5ELEVBQXlEO0FBQzVELFFBQUlMLFVBQVUsRUFBQzdLLE9BQU9nTCxVQUFSLEVBQW9CL0ssUUFBUWdMLFdBQTVCLEVBQWQ7O0FBRUEsUUFBSUUsYUFBYWpTLE9BQU84QixJQUFQLENBQVlrUSxJQUFaLEVBQWtCRSxNQUFsQixDQUF5QixVQUFTblQsTUFBVCxFQUFpQmlELEdBQWpCLEVBQXNCO0FBQzVELFlBQUl2QyxRQUFRdVMsS0FBS2hRLEdBQUwsQ0FBWjtBQUFBLFlBQ0ltUSxTQUFTZCx5QkFBeUI1UixLQUF6QixDQURiO0FBQUEsWUFFSTJTLGFBQWFWLHNCQUFzQjFQLEdBQXRCLEVBQTJCbVEsTUFBM0IsRUFBbUNSLE9BQW5DLENBRmpCOztBQUlBNVMsZUFBT2lELEdBQVAsSUFBY29RLFVBQWQ7QUFDQSxlQUFPclQsTUFBUDtBQUNILEtBUGdCLEVBT2QsRUFQYyxDQUFqQjs7QUFTQSxXQUFPO0FBQ0hzVCxZQUFJSixXQUFXL0osSUFEWjtBQUVIb0ssWUFBSUwsV0FBV3ZILEdBRlo7QUFHSDZILFlBQUlOLFdBQVc3SixLQUFYLEdBQW1CNkosV0FBVy9KLElBSC9CO0FBSUhzSyxZQUFJUCxXQUFXTCxNQUFYLEdBQW9CSyxXQUFXdkg7QUFKaEMsS0FBUDtBQU1ILEU7Ozs7Ozs7Ozs7QUM5dUJEO0FBQ0E7QUFDQTtBQUNBLElBQU14RSxPQUFPO0FBQ1RDLFdBQU8sbUJBQUFDLENBQVEsQ0FBUjtBQURFLENBQWI7O0FBSUE7Ozs7Ozs7OztBQVNBLFNBQVNxTSxZQUFULENBQXNCaE8sSUFBdEIsRUFBNEJxQixJQUE1QixFQUFrQzRNLFNBQWxDLEVBQTZDQyxVQUE3QyxFQUF5RDtBQUNyRCxRQUFJLENBQUM3TSxJQUFMLEVBQVc7QUFDUCxZQUFJNE0sU0FBSixFQUFlO0FBQ1gsaUJBQUs1TSxJQUFMLEdBQVksSUFBSTRNLFNBQUosQ0FBY2pPLEtBQUs1RCxDQUFMLEdBQVM0RCxLQUFLUyxDQUE1QixDQUFaO0FBQ0EsZ0JBQUl3TixjQUFjRSxLQUFkLElBQXVCRCxVQUEzQixFQUF1QztBQUNuQzdTLGdCQUFBLHFFQUFBQSxDQUFZQyxJQUFaLENBQWlCLEtBQUsrRixJQUF0QixFQUE0QixDQUE1QjtBQUNIO0FBQ0osU0FMRCxNQUtPO0FBQ0gsaUJBQUtBLElBQUwsR0FBWSxJQUFJK0ksVUFBSixDQUFlcEssS0FBSzVELENBQUwsR0FBUzRELEtBQUtTLENBQTdCLENBQVo7QUFDQSxnQkFBSTJKLGVBQWUrRCxLQUFmLElBQXdCRCxVQUE1QixFQUF3QztBQUNwQzdTLGdCQUFBLHFFQUFBQSxDQUFZQyxJQUFaLENBQWlCLEtBQUsrRixJQUF0QixFQUE0QixDQUE1QjtBQUNIO0FBQ0o7QUFDSixLQVpELE1BWU87QUFDSCxhQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNELFNBQUtyQixJQUFMLEdBQVlBLElBQVo7QUFDSDs7QUFFRDs7Ozs7OztBQU9BZ08sYUFBYWxXLFNBQWIsQ0FBdUJzVyxpQkFBdkIsR0FBMkMsVUFBU0MsTUFBVCxFQUFpQkMsTUFBakIsRUFBeUI7QUFDaEUsV0FBUUQsT0FBT2pTLENBQVAsSUFBWWtTLE1BQWIsSUFDQ0QsT0FBTzVOLENBQVAsSUFBWTZOLE1BRGIsSUFFQ0QsT0FBT2pTLENBQVAsR0FBWSxLQUFLNEQsSUFBTCxDQUFVNUQsQ0FBVixHQUFja1MsTUFGM0IsSUFHQ0QsT0FBTzVOLENBQVAsR0FBWSxLQUFLVCxJQUFMLENBQVVTLENBQVYsR0FBYzZOLE1BSGxDO0FBSUgsQ0FMRDs7QUFPQTs7Ozs7Ozs7QUFRQU4sYUFBYU8sTUFBYixHQUFzQixVQUFTL0QsS0FBVCxFQUFnQnBPLENBQWhCLEVBQW1CcUUsQ0FBbkIsRUFBc0I7QUFDeEMsUUFBSStOLEtBQUtyVixLQUFLa0QsS0FBTCxDQUFXRCxDQUFYLENBQVQ7QUFDQSxRQUFJcVMsS0FBS3RWLEtBQUtrRCxLQUFMLENBQVdvRSxDQUFYLENBQVQ7QUFDQSxRQUFJaU8sSUFBSWxFLE1BQU14SyxJQUFOLENBQVc1RCxDQUFuQjtBQUNBLFFBQUl1UyxPQUFPRixLQUFLakUsTUFBTXhLLElBQU4sQ0FBVzVELENBQWhCLEdBQW9Cb1MsRUFBL0I7QUFDQSxRQUFJSSxJQUFJcEUsTUFBTW5KLElBQU4sQ0FBV3NOLE9BQU8sQ0FBbEIsQ0FBUjtBQUNBLFFBQUl4RCxJQUFJWCxNQUFNbkosSUFBTixDQUFXc04sT0FBTyxDQUFsQixDQUFSO0FBQ0EsUUFBSTVELElBQUlQLE1BQU1uSixJQUFOLENBQVdzTixPQUFPRCxDQUFsQixDQUFSO0FBQ0EsUUFBSUcsSUFBSXJFLE1BQU1uSixJQUFOLENBQVdzTixPQUFPRCxDQUFQLEdBQVcsQ0FBdEIsQ0FBUjtBQUNBLFFBQUlJLElBQUlGLElBQUl6RCxDQUFaO0FBQ0EvTyxTQUFLb1MsRUFBTDtBQUNBL04sU0FBS2dPLEVBQUw7O0FBRUEsUUFBSW5VLFNBQVNuQixLQUFLa0QsS0FBTCxDQUFXRCxLQUFLcUUsS0FBS3FPLElBQUkvRCxDQUFKLEdBQVE4RCxDQUFiLElBQWtCQyxDQUF2QixJQUE0QnJPLEtBQUtzSyxJQUFJNkQsQ0FBVCxDQUE1QixHQUEwQ0EsQ0FBckQsQ0FBYjtBQUNBLFdBQU90VSxNQUFQO0FBQ0gsQ0FmRDs7QUFpQkE7Ozs7QUFJQTBULGFBQWFlLFVBQWIsR0FBMEIsVUFBU2xHLEtBQVQsRUFBZ0I7QUFDdEMsUUFBSTVNLElBQUk0TSxNQUFNelEsTUFBZDtBQUNBLFdBQU82RCxHQUFQLEVBQVk7QUFDUjRNLGNBQU01TSxDQUFOLElBQVcsQ0FBWDtBQUNIO0FBQ0osQ0FMRDs7QUFPQTs7Ozs7O0FBTUErUixhQUFhbFcsU0FBYixDQUF1QmtYLFFBQXZCLEdBQWtDLFVBQVMxSSxJQUFULEVBQWV0RyxJQUFmLEVBQXFCO0FBQ25ELFdBQU8sSUFBSSwwREFBSixDQUFhc0csSUFBYixFQUFtQnRHLElBQW5CLEVBQXlCLElBQXpCLENBQVA7QUFDSCxDQUZEOztBQUlBOzs7OztBQUtBZ08sYUFBYWxXLFNBQWIsQ0FBdUJtWCxjQUF2QixHQUF3QyxVQUFTOU0sWUFBVCxFQUF1Qm1FLElBQXZCLEVBQTZCO0FBQ2pFLFFBQUk0SSxRQUFRL00sYUFBYW5DLElBQWIsQ0FBa0JTLENBQTlCO0FBQUEsUUFBaUMwTyxRQUFRaE4sYUFBYW5DLElBQWIsQ0FBa0I1RCxDQUEzRDtBQUNBLFFBQUlBLENBQUosRUFBT3FFLENBQVA7QUFDQSxTQUFNckUsSUFBSSxDQUFWLEVBQWFBLElBQUkrUyxLQUFqQixFQUF3Qi9TLEdBQXhCLEVBQTZCO0FBQ3pCLGFBQU1xRSxJQUFJLENBQVYsRUFBYUEsSUFBSXlPLEtBQWpCLEVBQXdCek8sR0FBeEIsRUFBNkI7QUFDekIwQix5QkFBYWQsSUFBYixDQUFrQlosSUFBSTBPLEtBQUosR0FBWS9TLENBQTlCLElBQW1DLEtBQUtpRixJQUFMLENBQVUsQ0FBQ2lGLEtBQUs3RixDQUFMLEdBQVNBLENBQVYsSUFBZSxLQUFLVCxJQUFMLENBQVU1RCxDQUF6QixHQUE2QmtLLEtBQUtsSyxDQUFsQyxHQUFzQ0EsQ0FBaEQsQ0FBbkM7QUFDSDtBQUNKO0FBQ0osQ0FSRDs7QUFVQTRSLGFBQWFsVyxTQUFiLENBQXVCc1gsTUFBdkIsR0FBZ0MsVUFBU2pOLFlBQVQsRUFBdUI7QUFDbkQsUUFBSS9KLFNBQVMsS0FBS2lKLElBQUwsQ0FBVWpKLE1BQXZCO0FBQUEsUUFBK0JpWCxVQUFVLEtBQUtoTyxJQUE5QztBQUFBLFFBQW9EaU8sVUFBVW5OLGFBQWFkLElBQTNFOztBQUVBLFdBQU9qSixRQUFQLEVBQWlCO0FBQ2JrWCxnQkFBUWxYLE1BQVIsSUFBa0JpWCxRQUFRalgsTUFBUixDQUFsQjtBQUNIO0FBQ0osQ0FORDs7QUFRQTs7Ozs7O0FBTUE0VixhQUFhbFcsU0FBYixDQUF1QnlYLEdBQXZCLEdBQTZCLFVBQVNuVCxDQUFULEVBQVlxRSxDQUFaLEVBQWU7QUFDeEMsV0FBTyxLQUFLWSxJQUFMLENBQVVaLElBQUksS0FBS1QsSUFBTCxDQUFVNUQsQ0FBZCxHQUFrQkEsQ0FBNUIsQ0FBUDtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BNFIsYUFBYWxXLFNBQWIsQ0FBdUIwWCxPQUF2QixHQUFpQyxVQUFTcFQsQ0FBVCxFQUFZcUUsQ0FBWixFQUFlO0FBQzVDLFFBQUl2SSxDQUFKOztBQUVBLFFBQUksQ0FBQyxLQUFLdVgsWUFBVixFQUF3QjtBQUNwQixhQUFLQSxZQUFMLEdBQW9CO0FBQ2hCclQsZUFBRyxFQURhO0FBRWhCcUUsZUFBRztBQUZhLFNBQXBCO0FBSUEsYUFBS3ZJLElBQUksQ0FBVCxFQUFZQSxJQUFJLEtBQUs4SCxJQUFMLENBQVU1RCxDQUExQixFQUE2QmxFLEdBQTdCLEVBQWtDO0FBQzlCLGlCQUFLdVgsWUFBTCxDQUFrQnJULENBQWxCLENBQW9CbEUsQ0FBcEIsSUFBeUJBLENBQXpCO0FBQ0EsaUJBQUt1WCxZQUFMLENBQWtCclQsQ0FBbEIsQ0FBb0JsRSxJQUFJLEtBQUs4SCxJQUFMLENBQVU1RCxDQUFsQyxJQUF1Q2xFLENBQXZDO0FBQ0g7QUFDRCxhQUFLQSxJQUFJLENBQVQsRUFBWUEsSUFBSSxLQUFLOEgsSUFBTCxDQUFVUyxDQUExQixFQUE2QnZJLEdBQTdCLEVBQWtDO0FBQzlCLGlCQUFLdVgsWUFBTCxDQUFrQmhQLENBQWxCLENBQW9CdkksQ0FBcEIsSUFBeUJBLENBQXpCO0FBQ0EsaUJBQUt1WCxZQUFMLENBQWtCaFAsQ0FBbEIsQ0FBb0J2SSxJQUFJLEtBQUs4SCxJQUFMLENBQVVTLENBQWxDLElBQXVDdkksQ0FBdkM7QUFDSDtBQUNKO0FBQ0QsV0FBTyxLQUFLbUosSUFBTCxDQUFXLEtBQUtvTyxZQUFMLENBQWtCaFAsQ0FBbEIsQ0FBb0JBLElBQUksS0FBS1QsSUFBTCxDQUFVUyxDQUFsQyxDQUFELEdBQXlDLEtBQUtULElBQUwsQ0FBVTVELENBQW5ELEdBQXVELEtBQUtxVCxZQUFMLENBQWtCclQsQ0FBbEIsQ0FBb0JBLElBQUksS0FBSzRELElBQUwsQ0FBVTVELENBQWxDLENBQWpFLENBQVA7QUFDSCxDQWxCRDs7QUFvQkE7Ozs7Ozs7QUFPQTRSLGFBQWFsVyxTQUFiLENBQXVCNFgsR0FBdkIsR0FBNkIsVUFBU3RULENBQVQsRUFBWXFFLENBQVosRUFBZXpGLEtBQWYsRUFBc0I7QUFDL0MsU0FBS3FHLElBQUwsQ0FBVVosSUFBSSxLQUFLVCxJQUFMLENBQVU1RCxDQUFkLEdBQWtCQSxDQUE1QixJQUFpQ3BCLEtBQWpDO0FBQ0EsV0FBTyxJQUFQO0FBQ0gsQ0FIRDs7QUFLQTs7O0FBR0FnVCxhQUFhbFcsU0FBYixDQUF1QjZYLFVBQXZCLEdBQW9DLFlBQVc7QUFDM0MsUUFBSXpYLENBQUo7QUFBQSxRQUFPbUssUUFBUSxLQUFLckMsSUFBTCxDQUFVNUQsQ0FBekI7QUFBQSxRQUE0QmtHLFNBQVMsS0FBS3RDLElBQUwsQ0FBVVMsQ0FBL0M7QUFBQSxRQUFrRFksT0FBTyxLQUFLQSxJQUE5RDtBQUNBLFNBQU1uSixJQUFJLENBQVYsRUFBYUEsSUFBSW1LLEtBQWpCLEVBQXdCbkssR0FBeEIsRUFBNkI7QUFDekJtSixhQUFLbkosQ0FBTCxJQUFVbUosS0FBSyxDQUFDaUIsU0FBUyxDQUFWLElBQWVELEtBQWYsR0FBdUJuSyxDQUE1QixJQUFpQyxDQUEzQztBQUNIO0FBQ0QsU0FBTUEsSUFBSSxDQUFWLEVBQWFBLElBQUlvSyxTQUFTLENBQTFCLEVBQTZCcEssR0FBN0IsRUFBa0M7QUFDOUJtSixhQUFLbkosSUFBSW1LLEtBQVQsSUFBa0JoQixLQUFLbkosSUFBSW1LLEtBQUosSUFBYUEsUUFBUSxDQUFyQixDQUFMLElBQWdDLENBQWxEO0FBQ0g7QUFDSixDQVJEOztBQVVBOzs7QUFHQTJMLGFBQWFsVyxTQUFiLENBQXVCOFgsTUFBdkIsR0FBZ0MsWUFBVztBQUN2QyxRQUFJdk8sT0FBTyxLQUFLQSxJQUFoQjtBQUFBLFFBQXNCakosU0FBU2lKLEtBQUtqSixNQUFwQzs7QUFFQSxXQUFPQSxRQUFQLEVBQWlCO0FBQ2JpSixhQUFLakosTUFBTCxJQUFlaUosS0FBS2pKLE1BQUwsSUFBZSxDQUFmLEdBQW1CLENBQWxDO0FBQ0g7QUFDSixDQU5EOztBQVFBNFYsYUFBYWxXLFNBQWIsQ0FBdUIrWCxRQUF2QixHQUFrQyxVQUFTbkwsTUFBVCxFQUFpQjtBQUMvQyxRQUFJdEksQ0FBSjtBQUFBLFFBQU9xRSxDQUFQO0FBQUEsUUFBVXFQLEVBQVY7QUFBQSxRQUFjQyxFQUFkO0FBQUEsUUFBa0JDLFFBQVN0TCxPQUFPdE0sTUFBUCxHQUFnQixDQUFqQixHQUFzQixDQUFoRDtBQUFBLFFBQW1ENlgsT0FBTyxDQUExRDtBQUNBLFNBQU14UCxJQUFJLENBQVYsRUFBYUEsSUFBSSxLQUFLVCxJQUFMLENBQVVTLENBQTNCLEVBQThCQSxHQUE5QixFQUFtQztBQUMvQixhQUFNckUsSUFBSSxDQUFWLEVBQWFBLElBQUksS0FBSzRELElBQUwsQ0FBVTVELENBQTNCLEVBQThCQSxHQUE5QixFQUFtQztBQUMvQjZULG1CQUFPLENBQVA7QUFDQSxpQkFBTUYsS0FBSyxDQUFDQyxLQUFaLEVBQW1CRCxNQUFNQyxLQUF6QixFQUFnQ0QsSUFBaEMsRUFBc0M7QUFDbEMscUJBQU1ELEtBQUssQ0FBQ0UsS0FBWixFQUFtQkYsTUFBTUUsS0FBekIsRUFBZ0NGLElBQWhDLEVBQXNDO0FBQ2xDRyw0QkFBUXZMLE9BQU9xTCxLQUFLQyxLQUFaLEVBQW1CRixLQUFLRSxLQUF4QixJQUFpQyxLQUFLUixPQUFMLENBQWFwVCxJQUFJMFQsRUFBakIsRUFBcUJyUCxJQUFJc1AsRUFBekIsQ0FBekM7QUFDSDtBQUNKO0FBQ0QsaUJBQUsxTyxJQUFMLENBQVVaLElBQUksS0FBS1QsSUFBTCxDQUFVNUQsQ0FBZCxHQUFrQkEsQ0FBNUIsSUFBaUM2VCxJQUFqQztBQUNIO0FBQ0o7QUFDSixDQWJEOztBQWVBakMsYUFBYWxXLFNBQWIsQ0FBdUJvWSxPQUF2QixHQUFpQyxVQUFTQyxVQUFULEVBQXFCO0FBQ2xELFFBQUk5TyxPQUFPLEtBQUtBLElBQWhCO0FBQUEsUUFDSWpGLENBREo7QUFBQSxRQUVJcUUsQ0FGSjtBQUFBLFFBR0k2QixTQUFTLEtBQUt0QyxJQUFMLENBQVVTLENBSHZCO0FBQUEsUUFJSTRCLFFBQVEsS0FBS3JDLElBQUwsQ0FBVTVELENBSnRCO0FBQUEsUUFLSUosR0FMSjtBQUFBLFFBTUlvVSxHQU5KO0FBQUEsUUFPSUMsV0FBVyxFQVBmO0FBQUEsUUFRSW5ZLENBUko7QUFBQSxRQVNJb1ksS0FUSjtBQUFBLFFBVUlDLElBVko7QUFBQSxRQVdJQyxJQVhKO0FBQUEsUUFZSUMsSUFaSjtBQUFBLFFBYUlDLEVBYko7QUFBQSxRQWNJQyxFQWRKO0FBQUEsUUFlSWpYLEdBZko7QUFBQSxRQWdCSVksU0FBUyxFQWhCYjtBQUFBLFFBaUJJc1csS0FBS3pYLEtBQUt5WCxFQWpCZDtBQUFBLFFBa0JJQyxPQUFPRCxLQUFLLENBbEJoQjs7QUFvQkEsUUFBSVQsY0FBYyxDQUFsQixFQUFxQjtBQUNqQixlQUFPN1YsTUFBUDtBQUNIOztBQUVELFNBQU1wQyxJQUFJLENBQVYsRUFBYUEsSUFBSWlZLFVBQWpCLEVBQTZCalksR0FBN0IsRUFBa0M7QUFDOUJtWSxpQkFBU25ZLENBQVQsSUFBYztBQUNWNFksaUJBQUssQ0FESztBQUVWQyxpQkFBSyxDQUZLO0FBR1ZDLGlCQUFLLENBSEs7QUFJVkMsaUJBQUssQ0FKSztBQUtWQyxpQkFBSyxDQUxLO0FBTVZDLGlCQUFLLENBTks7QUFPVkMsbUJBQU8sQ0FQRztBQVFWQyxpQkFBSztBQVJLLFNBQWQ7QUFVSDs7QUFFRCxTQUFNNVEsSUFBSSxDQUFWLEVBQWFBLElBQUk2QixNQUFqQixFQUF5QjdCLEdBQXpCLEVBQThCO0FBQzFCMlAsY0FBTTNQLElBQUlBLENBQVY7QUFDQSxhQUFNckUsSUFBSSxDQUFWLEVBQWFBLElBQUlpRyxLQUFqQixFQUF3QmpHLEdBQXhCLEVBQTZCO0FBQ3pCSixrQkFBTXFGLEtBQUtaLElBQUk0QixLQUFKLEdBQVlqRyxDQUFqQixDQUFOO0FBQ0EsZ0JBQUlKLE1BQU0sQ0FBVixFQUFhO0FBQ1RzVSx3QkFBUUQsU0FBU3JVLE1BQU0sQ0FBZixDQUFSO0FBQ0FzVSxzQkFBTVEsR0FBTixJQUFhLENBQWI7QUFDQVIsc0JBQU1TLEdBQU4sSUFBYXRRLENBQWI7QUFDQTZQLHNCQUFNVSxHQUFOLElBQWE1VSxDQUFiO0FBQ0FrVSxzQkFBTVcsR0FBTixJQUFhN1UsSUFBSXFFLENBQWpCO0FBQ0E2UCxzQkFBTVksR0FBTixJQUFhZCxHQUFiO0FBQ0FFLHNCQUFNYSxHQUFOLElBQWEvVSxJQUFJQSxDQUFqQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxTQUFNbEUsSUFBSSxDQUFWLEVBQWFBLElBQUlpWSxVQUFqQixFQUE2QmpZLEdBQTdCLEVBQWtDO0FBQzlCb1ksZ0JBQVFELFNBQVNuWSxDQUFULENBQVI7QUFDQSxZQUFJLENBQUNvWixNQUFNaEIsTUFBTVEsR0FBWixDQUFELElBQXFCUixNQUFNUSxHQUFOLEtBQWMsQ0FBdkMsRUFBMEM7QUFDdENKLGlCQUFLSixNQUFNVSxHQUFOLEdBQVlWLE1BQU1RLEdBQXZCO0FBQ0FILGlCQUFLTCxNQUFNUyxHQUFOLEdBQVlULE1BQU1RLEdBQXZCO0FBQ0FQLG1CQUFPRCxNQUFNVyxHQUFOLEdBQVlYLE1BQU1RLEdBQWxCLEdBQXdCSixLQUFLQyxFQUFwQztBQUNBSCxtQkFBT0YsTUFBTVksR0FBTixHQUFZWixNQUFNUSxHQUFsQixHQUF3QkgsS0FBS0EsRUFBcEM7QUFDQUYsbUJBQU9ILE1BQU1hLEdBQU4sR0FBWWIsTUFBTVEsR0FBbEIsR0FBd0JKLEtBQUtBLEVBQXBDO0FBQ0FoWCxrQkFBTSxDQUFDOFcsT0FBT0MsSUFBUixLQUFpQixJQUFJRixJQUFyQixDQUFOO0FBQ0E3VyxrQkFBTSxNQUFNUCxLQUFLb1ksSUFBTCxDQUFVN1gsR0FBVixDQUFOLElBQXdCNlcsUUFBUSxDQUFSLEdBQVlNLElBQVosR0FBbUIsQ0FBQ0EsSUFBNUMsSUFBcURELEVBQTNEO0FBQ0FOLGtCQUFNYyxLQUFOLEdBQWMsQ0FBQzFYLE1BQU0sR0FBTixHQUFZa1gsRUFBWixHQUFpQixFQUFsQixJQUF3QixHQUF4QixHQUE4QixFQUE1QztBQUNBLGdCQUFJTixNQUFNYyxLQUFOLEdBQWMsQ0FBbEIsRUFBcUI7QUFDakJkLHNCQUFNYyxLQUFOLElBQWUsR0FBZjtBQUNIO0FBQ0RkLGtCQUFNZSxHQUFOLEdBQVkzWCxNQUFNa1gsRUFBTixHQUFXbFgsTUFBTWtYLEVBQWpCLEdBQXNCbFgsR0FBbEM7QUFDQTRXLGtCQUFNeEssR0FBTixHQUFZckUsS0FBS0MsS0FBTCxDQUFXLENBQUN2SSxLQUFLcVksR0FBTCxDQUFTOVgsR0FBVCxDQUFELEVBQWdCUCxLQUFLc1ksR0FBTCxDQUFTL1gsR0FBVCxDQUFoQixDQUFYLENBQVo7QUFDQVksbUJBQU9KLElBQVAsQ0FBWW9XLEtBQVo7QUFDSDtBQUNKOztBQUVELFdBQU9oVyxNQUFQO0FBQ0gsQ0EzRUQ7O0FBNkVBOzs7OztBQUtBMFQsYUFBYWxXLFNBQWIsQ0FBdUI0WixJQUF2QixHQUE4QixVQUFTN0gsTUFBVCxFQUFpQjhILEtBQWpCLEVBQXdCO0FBQ2xELFFBQUkxUixHQUFKLEVBQ0kyUixLQURKLEVBRUl2USxJQUZKLEVBR0l3USxPQUhKLEVBSUlDLEtBSkosRUFLSTFWLENBTEosRUFNSXFFLENBTko7O0FBUUEsUUFBSSxDQUFDa1IsS0FBTCxFQUFZO0FBQ1JBLGdCQUFRLEdBQVI7QUFDSDtBQUNEMVIsVUFBTTRKLE9BQU9NLFVBQVAsQ0FBa0IsSUFBbEIsQ0FBTjtBQUNBTixXQUFPeEgsS0FBUCxHQUFlLEtBQUtyQyxJQUFMLENBQVU1RCxDQUF6QjtBQUNBeU4sV0FBT3ZILE1BQVAsR0FBZ0IsS0FBS3RDLElBQUwsQ0FBVVMsQ0FBMUI7QUFDQW1SLFlBQVEzUixJQUFJbUIsWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QnlJLE9BQU94SCxLQUE5QixFQUFxQ3dILE9BQU92SCxNQUE1QyxDQUFSO0FBQ0FqQixXQUFPdVEsTUFBTXZRLElBQWI7QUFDQXdRLGNBQVUsQ0FBVjtBQUNBLFNBQUtwUixJQUFJLENBQVQsRUFBWUEsSUFBSSxLQUFLVCxJQUFMLENBQVVTLENBQTFCLEVBQTZCQSxHQUE3QixFQUFrQztBQUM5QixhQUFLckUsSUFBSSxDQUFULEVBQVlBLElBQUksS0FBSzRELElBQUwsQ0FBVTVELENBQTFCLEVBQTZCQSxHQUE3QixFQUFrQztBQUM5QjBWLG9CQUFRclIsSUFBSSxLQUFLVCxJQUFMLENBQVU1RCxDQUFkLEdBQWtCQSxDQUExQjtBQUNBeVYsc0JBQVUsS0FBS3RDLEdBQUwsQ0FBU25ULENBQVQsRUFBWXFFLENBQVosSUFBaUJrUixLQUEzQjtBQUNBdFEsaUJBQUt5USxRQUFRLENBQVIsR0FBWSxDQUFqQixJQUFzQkQsT0FBdEI7QUFDQXhRLGlCQUFLeVEsUUFBUSxDQUFSLEdBQVksQ0FBakIsSUFBc0JELE9BQXRCO0FBQ0F4USxpQkFBS3lRLFFBQVEsQ0FBUixHQUFZLENBQWpCLElBQXNCRCxPQUF0QjtBQUNBeFEsaUJBQUt5USxRQUFRLENBQVIsR0FBWSxDQUFqQixJQUFzQixHQUF0QjtBQUNIO0FBQ0o7QUFDRDtBQUNBN1IsUUFBSXVCLFlBQUosQ0FBaUJvUSxLQUFqQixFQUF3QixDQUF4QixFQUEyQixDQUEzQjtBQUNILENBOUJEOztBQWdDQTs7Ozs7QUFLQTVELGFBQWFsVyxTQUFiLENBQXVCaWEsT0FBdkIsR0FBaUMsVUFBU2xJLE1BQVQsRUFBaUI4SCxLQUFqQixFQUF3QnJMLElBQXhCLEVBQThCO0FBQzNELFFBQUksQ0FBQ3FMLEtBQUQsSUFBVUEsUUFBUSxDQUFsQixJQUF1QkEsUUFBUSxHQUFuQyxFQUF3QztBQUNwQ0EsZ0JBQVEsR0FBUjtBQUNIO0FBQ0QsUUFBSWhILE1BQU0sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBVjtBQUNBLFFBQUlDLE1BQU0sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBVjtBQUNBLFFBQUlvSCxXQUFXLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBQWY7QUFDQSxRQUFJQyxXQUFXLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQWY7QUFDQSxRQUFJM1gsU0FBUyxFQUFiO0FBQ0EsUUFBSTJGLE1BQU00SixPQUFPTSxVQUFQLENBQWtCLElBQWxCLENBQVY7QUFDQSxRQUFJeUgsUUFBUTNSLElBQUltQixZQUFKLENBQWlCa0YsS0FBS2xLLENBQXRCLEVBQXlCa0ssS0FBSzdGLENBQTlCLEVBQWlDLEtBQUtULElBQUwsQ0FBVTVELENBQTNDLEVBQThDLEtBQUs0RCxJQUFMLENBQVVTLENBQXhELENBQVo7QUFDQSxRQUFJWSxPQUFPdVEsTUFBTXZRLElBQWpCO0FBQ0EsUUFBSWpKLFNBQVMsS0FBS2lKLElBQUwsQ0FBVWpKLE1BQXZCO0FBQ0EsV0FBT0EsUUFBUCxFQUFpQjtBQUNidVMsWUFBSSxDQUFKLElBQVMsS0FBS3RKLElBQUwsQ0FBVWpKLE1BQVYsSUFBb0J1WixLQUE3QjtBQUNBclgsaUJBQVNxUSxJQUFJLENBQUosS0FBVSxDQUFWLEdBQWNxSCxRQUFkLEdBQXlCckgsSUFBSSxDQUFKLEtBQVUsR0FBVixHQUFnQnNILFFBQWhCLEdBQTJCLHdGQUFBdkgsQ0FBUUMsR0FBUixFQUFhQyxHQUFiLENBQTdEO0FBQ0F2SixhQUFLakosU0FBUyxDQUFULEdBQWEsQ0FBbEIsSUFBdUJrQyxPQUFPLENBQVAsQ0FBdkI7QUFDQStHLGFBQUtqSixTQUFTLENBQVQsR0FBYSxDQUFsQixJQUF1QmtDLE9BQU8sQ0FBUCxDQUF2QjtBQUNBK0csYUFBS2pKLFNBQVMsQ0FBVCxHQUFhLENBQWxCLElBQXVCa0MsT0FBTyxDQUFQLENBQXZCO0FBQ0ErRyxhQUFLakosU0FBUyxDQUFULEdBQWEsQ0FBbEIsSUFBdUIsR0FBdkI7QUFDSDtBQUNENkgsUUFBSXVCLFlBQUosQ0FBaUJvUSxLQUFqQixFQUF3QnRMLEtBQUtsSyxDQUE3QixFQUFnQ2tLLEtBQUs3RixDQUFyQztBQUNILENBdEJEOztBQXdCQSx3REFBZXVOLFlBQWYsQzs7Ozs7O0FDNVZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hCQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDaEJBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3BCQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDaENBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDcENBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDbENBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM1QkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FB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ZSI6InF1YWdnYS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoZmFjdG9yeS50b1N0cmluZygpKS5kZWZhdWx0O1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUXVhZ2dhXCJdID0gZmFjdG9yeShmYWN0b3J5LnRvU3RyaW5nKCkpLmRlZmF1bHQ7XG5cdGVsc2Vcblx0XHRyb290W1wiUXVhZ2dhXCJdID0gZmFjdG9yeShmYWN0b3J5LnRvU3RyaW5nKCkpLmRlZmF1bHQ7XG59KSh0aGlzLCBmdW5jdGlvbihfX2ZhY3RvcnlTb3VyY2VfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL215TW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNjYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDc1NjBjYzQ5MjcyMzFiMmUzNzg5IiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzT2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcblxuZnVuY3Rpb24gQmFyY29kZVJlYWRlcihjb25maWcsIHN1cHBsZW1lbnRzKSB7XG4gICAgdGhpcy5fcm93ID0gW107XG4gICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwge307XG4gICAgdGhpcy5zdXBwbGVtZW50cyA9IHN1cHBsZW1lbnRzO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5fbmV4dFVuc2V0ID0gZnVuY3Rpb24obGluZSwgc3RhcnQpIHtcbiAgICB2YXIgaTtcblxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbGluZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xufTtcblxuQmFyY29kZVJlYWRlci5wcm90b3R5cGUuX21hdGNoUGF0dGVybiA9IGZ1bmN0aW9uKGNvdW50ZXIsIGNvZGUsIG1heFNpbmdsZUVycm9yKSB7XG4gICAgdmFyIGksXG4gICAgICAgIGVycm9yID0gMCxcbiAgICAgICAgc2luZ2xlRXJyb3IgPSAwLFxuICAgICAgICBzdW0gPSAwLFxuICAgICAgICBtb2R1bG8gPSAwLFxuICAgICAgICBiYXJXaWR0aCxcbiAgICAgICAgY291bnQsXG4gICAgICAgIHNjYWxlZDtcblxuICAgIG1heFNpbmdsZUVycm9yID0gbWF4U2luZ2xlRXJyb3IgfHwgdGhpcy5TSU5HTEVfQ09ERV9FUlJPUiB8fCAxO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3VtICs9IGNvdW50ZXJbaV07XG4gICAgICAgIG1vZHVsbyArPSBjb2RlW2ldO1xuICAgIH1cbiAgICBpZiAoc3VtIDwgbW9kdWxvKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBiYXJXaWR0aCA9IHN1bSAvIG1vZHVsbztcbiAgICBtYXhTaW5nbGVFcnJvciAqPSBiYXJXaWR0aDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvdW50ID0gY291bnRlcltpXTtcbiAgICAgICAgc2NhbGVkID0gY29kZVtpXSAqIGJhcldpZHRoO1xuICAgICAgICBzaW5nbGVFcnJvciA9IE1hdGguYWJzKGNvdW50IC0gc2NhbGVkKSAvIHNjYWxlZDtcbiAgICAgICAgaWYgKHNpbmdsZUVycm9yID4gbWF4U2luZ2xlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yICs9IHNpbmdsZUVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3IgLyBtb2R1bG87XG59O1xuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5fbmV4dFNldCA9IGZ1bmN0aW9uKGxpbmUsIG9mZnNldCkge1xuICAgIHZhciBpO1xuXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGluZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xufTtcblxuQmFyY29kZVJlYWRlci5wcm90b3R5cGUuX2NvcnJlY3RCYXJzID0gZnVuY3Rpb24oY291bnRlciwgY29ycmVjdGlvbiwgaW5kaWNlcykge1xuICAgIHZhciBsZW5ndGggPSBpbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgdG1wID0gMDtcbiAgICB3aGlsZShsZW5ndGgtLSkge1xuICAgICAgICB0bXAgPSBjb3VudGVyW2luZGljZXNbbGVuZ3RoXV0gKiAoMSAtICgoMSAtIGNvcnJlY3Rpb24pIC8gMikpO1xuICAgICAgICBpZiAodG1wID4gMSkge1xuICAgICAgICAgICAgY291bnRlcltpbmRpY2VzW2xlbmd0aF1dID0gdG1wO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5fbWF0Y2hUcmFjZSA9IGZ1bmN0aW9uKGNtcENvdW50ZXIsIGVwc2lsb24pIHtcbiAgICB2YXIgY291bnRlciA9IFtdLFxuICAgICAgICBpLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fbmV4dFNldChzZWxmLl9yb3cpLFxuICAgICAgICBpc1doaXRlID0gIXNlbGYuX3Jvd1tvZmZzZXRdLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yO1xuXG4gICAgaWYgKGNtcENvdW50ZXIpIHtcbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBjbXBDb3VudGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb3VudGVyLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICggaSA9IG9mZnNldDsgaSA8IHNlbGYuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBzZWxmLl9tYXRjaFBhdHRlcm4oY291bnRlciwgY21wQ291bnRlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb3VudGVyLnB1c2goMCk7XG4gICAgICAgIGZvciAoIGkgPSBvZmZzZXQ7IGkgPCBzZWxmLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgY291bnRlci5wdXNoKDApO1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIGNtcENvdW50ZXIgd2FzIG5vdCBnaXZlblxuICAgIGJlc3RNYXRjaC5zdGFydCA9IG9mZnNldDtcbiAgICBiZXN0TWF0Y2guZW5kID0gc2VsZi5fcm93Lmxlbmd0aCAtIDE7XG4gICAgYmVzdE1hdGNoLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIHJldHVybiBiZXN0TWF0Y2g7XG59O1xuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5kZWNvZGVQYXR0ZXJuID0gZnVuY3Rpb24ocGF0dGVybikge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgc2VsZi5fcm93ID0gcGF0dGVybjtcbiAgICByZXN1bHQgPSBzZWxmLl9kZWNvZGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHNlbGYuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIHJlc3VsdCA9IHNlbGYuX2RlY29kZSgpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZVJlYWRlci5ESVJFQ1RJT04uUkVWRVJTRTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHNlbGYuX3Jvdy5sZW5ndGggLSByZXN1bHQuc3RhcnQ7XG4gICAgICAgICAgICByZXN1bHQuZW5kID0gc2VsZi5fcm93Lmxlbmd0aCAtIHJlc3VsdC5lbmQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZVJlYWRlci5ESVJFQ1RJT04uRk9SV0FSRDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuZm9ybWF0ID0gc2VsZi5GT1JNQVQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5fbWF0Y2hSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHZhbHVlKSB7XG4gICAgdmFyIGk7XG5cbiAgICBzdGFydCA9IHN0YXJ0IDwgMCA/IDAgOiBzdGFydDtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9yb3dbaV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5CYXJjb2RlUmVhZGVyLnByb3RvdHlwZS5fZmlsbENvdW50ZXJzID0gZnVuY3Rpb24ob2Zmc2V0LCBlbmQsIGlzV2hpdGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGNvdW50ZXJQb3MgPSAwLFxuICAgICAgICBpLFxuICAgICAgICBjb3VudGVycyA9IFtdO1xuXG4gICAgaXNXaGl0ZSA9ICh0eXBlb2YgaXNXaGl0ZSAhPT0gJ3VuZGVmaW5lZCcpID8gaXNXaGl0ZSA6IHRydWU7XG4gICAgb2Zmc2V0ID0gKHR5cGVvZiBvZmZzZXQgIT09ICd1bmRlZmluZWQnKSA/IG9mZnNldCA6IHNlbGYuX25leHRVbnNldChzZWxmLl9yb3cpO1xuICAgIGVuZCA9IGVuZCB8fCBzZWxmLl9yb3cubGVuZ3RoO1xuXG4gICAgY291bnRlcnNbY291bnRlclBvc10gPSAwO1xuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVycztcbn07XG5cbkJhcmNvZGVSZWFkZXIucHJvdG90eXBlLl90b0NvdW50ZXJzID0gZnVuY3Rpb24oc3RhcnQsIGNvdW50ZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIG51bUNvdW50ZXJzID0gY291bnRlci5sZW5ndGgsXG4gICAgICAgIGVuZCA9IHNlbGYuX3Jvdy5sZW5ndGgsXG4gICAgICAgIGlzV2hpdGUgPSAhc2VsZi5fcm93W3N0YXJ0XSxcbiAgICAgICAgaSxcbiAgICAgICAgY291bnRlclBvcyA9IDA7XG5cbiAgICBBcnJheUhlbHBlci5pbml0KGNvdW50ZXIsIDApO1xuXG4gICAgZm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBudW1Db3VudGVycykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlcjtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXJjb2RlUmVhZGVyLnByb3RvdHlwZSwgXCJGT1JNQVRcIiwge1xuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgd3JpdGVhYmxlOiBmYWxzZVxufSk7XG5cbkJhcmNvZGVSZWFkZXIuRElSRUNUSU9OID0ge1xuICAgIEZPUldBUkQ6IDEsXG4gICAgUkVWRVJTRTogLTFcbn07XG5cbkJhcmNvZGVSZWFkZXIuRXhjZXB0aW9uID0ge1xuICAgIFN0YXJ0Tm90Rm91bmRFeGNlcHRpb246IFwiU3RhcnQtSW5mbyB3YXMgbm90IGZvdW5kIVwiLFxuICAgIENvZGVOb3RGb3VuZEV4Y2VwdGlvbjogXCJDb2RlIGNvdWxkIG5vdCBiZSBmb3VuZCFcIixcbiAgICBQYXR0ZXJuTm90Rm91bmRFeGNlcHRpb246IFwiUGF0dGVybiBjb3VsZCBub3QgYmUgZm91bmQhXCJcbn07XG5cbkJhcmNvZGVSZWFkZXIuQ09ORklHX0tFWVMgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgQmFyY29kZVJlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvYmFyY29kZV9yZWFkZXIuanMiLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0OiBmdW5jdGlvbihhcnIsIHZhbCkge1xuICAgICAgICB2YXIgbCA9IGFyci5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgICAgIGFycltsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTaHVmZmxlcyB0aGUgY29udGVudCBvZiBhbiBhcnJheVxuICAgICAqIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgaXRzZWxmIHNodWZmbGVkXG4gICAgICovXG4gICAgc2h1ZmZsZTogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBpID0gYXJyLmxlbmd0aCAtIDEsIGosIHg7XG4gICAgICAgIGZvciAoaTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBpKTtcbiAgICAgICAgICAgIHggPSBhcnJbaV07XG4gICAgICAgICAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgICAgICAgICBhcnJbal0gPSB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHRvUG9pbnRMaXN0OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdmFyIGksIGosIHJvdyA9IFtdLCByb3dzID0gW107XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb3cgPSBbXTtcbiAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgYXJyW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcm93W2pdID0gYXJyW2ldW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93c1tpXSA9IFwiW1wiICsgcm93LmpvaW4oXCIsXCIpICsgXCJdXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiW1wiICsgcm93cy5qb2luKFwiLFxcclxcblwiKSArIFwiXVwiO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRoZSBlbGVtZW50cyB3aGljaCdzIHNjb3JlIGlzIGJpZ2dlciB0aGFuIHRoZSB0aHJlc2hvbGRcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gdGhlIHJlZHVjZWQgYXJyYXlcbiAgICAgKi9cbiAgICB0aHJlc2hvbGQ6IGZ1bmN0aW9uKGFyciwgdGhyZXNob2xkLCBzY29yZUZ1bmMpIHtcbiAgICAgICAgdmFyIGksIHF1ZXVlID0gW107XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2NvcmVGdW5jLmFwcGx5KGFyciwgW2FycltpXV0pID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goYXJyW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfSxcblxuICAgIG1heEluZGV4OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdmFyIGksIG1heCA9IDA7XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJyW2ldID4gYXJyW21heF0pIHtcbiAgICAgICAgICAgICAgICBtYXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfSxcblxuICAgIG1heDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBpLCBtYXggPSAwO1xuICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycltpXSA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH0sXG5cbiAgICBzdW06IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aCxcbiAgICAgICAgICAgIHN1bSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBzdW0gKz0gYXJyW2xlbmd0aF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9hcnJheV9oZWxwZXIuanMiLCJpbXBvcnQgQmFyY29kZVJlYWRlciBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ2xvZGFzaCc7XG5cbmZ1bmN0aW9uIEVBTlJlYWRlcihvcHRzLCBzdXBwbGVtZW50cykge1xuICAgIG9wdHMgPSBtZXJnZShnZXREZWZhdWxDb25maWcoKSwgb3B0cyk7XG4gICAgQmFyY29kZVJlYWRlci5jYWxsKHRoaXMsIG9wdHMsIHN1cHBsZW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsQ29uZmlnKCkge1xuICAgIHZhciBjb25maWcgPSB7fTtcblxuICAgIE9iamVjdC5rZXlzKEVBTlJlYWRlci5DT05GSUdfS0VZUykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSBFQU5SZWFkZXIuQ09ORklHX0tFWVNba2V5XS5kZWZhdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICAgIENPREVfTF9TVEFSVDoge3ZhbHVlOiAwfSxcbiAgICBDT0RFX0dfU1RBUlQ6IHt2YWx1ZTogMTB9LFxuICAgIFNUQVJUX1BBVFRFUk46IHt2YWx1ZTogWzEsIDEsIDFdfSxcbiAgICBTVE9QX1BBVFRFUk46IHt2YWx1ZTogWzEsIDEsIDFdfSxcbiAgICBNSURETEVfUEFUVEVSTjoge3ZhbHVlOiBbMSwgMSwgMSwgMSwgMV19LFxuICAgIEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOOiB7dmFsdWU6IFsxLCAxLCAyXX0sXG4gICAgQ09ERV9QQVRURVJOOiB7dmFsdWU6IFtcbiAgICAgICAgWzMsIDIsIDEsIDFdLFxuICAgICAgICBbMiwgMiwgMiwgMV0sXG4gICAgICAgIFsyLCAxLCAyLCAyXSxcbiAgICAgICAgWzEsIDQsIDEsIDFdLFxuICAgICAgICBbMSwgMSwgMywgMl0sXG4gICAgICAgIFsxLCAyLCAzLCAxXSxcbiAgICAgICAgWzEsIDEsIDEsIDRdLFxuICAgICAgICBbMSwgMywgMSwgMl0sXG4gICAgICAgIFsxLCAyLCAxLCAzXSxcbiAgICAgICAgWzMsIDEsIDEsIDJdLFxuICAgICAgICBbMSwgMSwgMiwgM10sXG4gICAgICAgIFsxLCAyLCAyLCAyXSxcbiAgICAgICAgWzIsIDIsIDEsIDJdLFxuICAgICAgICBbMSwgMSwgNCwgMV0sXG4gICAgICAgIFsyLCAzLCAxLCAxXSxcbiAgICAgICAgWzEsIDMsIDIsIDFdLFxuICAgICAgICBbNCwgMSwgMSwgMV0sXG4gICAgICAgIFsyLCAxLCAzLCAxXSxcbiAgICAgICAgWzMsIDEsIDIsIDFdLFxuICAgICAgICBbMiwgMSwgMSwgM11cbiAgICBdfSxcbiAgICBDT0RFX0ZSRVFVRU5DWToge3ZhbHVlOiBbMCwgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl19LFxuICAgIFNJTkdMRV9DT0RFX0VSUk9SOiB7dmFsdWU6IDAuNzB9LFxuICAgIEFWR19DT0RFX0VSUk9SOiB7dmFsdWU6IDAuNDh9LFxuICAgIEZPUk1BVDoge3ZhbHVlOiBcImVhbl8xM1wiLCB3cml0ZWFibGU6IGZhbHNlfVxufTtcblxuRUFOUmVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFyY29kZVJlYWRlci5wcm90b3R5cGUsIHByb3BlcnRpZXMpO1xuRUFOUmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVBTlJlYWRlcjtcblxuRUFOUmVhZGVyLnByb3RvdHlwZS5fZGVjb2RlQ29kZSA9IGZ1bmN0aW9uKHN0YXJ0LCBjb2RlcmFuZ2UpIHtcbiAgICB2YXIgY291bnRlciA9IFswLCAwLCAwLCAwXSxcbiAgICAgICAgaSxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIG9mZnNldCA9IHN0YXJ0LFxuICAgICAgICBpc1doaXRlID0gIXNlbGYuX3Jvd1tvZmZzZXRdLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRcbiAgICAgICAgfSxcbiAgICAgICAgY29kZSxcbiAgICAgICAgZXJyb3I7XG5cbiAgICBpZiAoIWNvZGVyYW5nZSkge1xuICAgICAgICBjb2RlcmFuZ2UgPSBzZWxmLkNPREVfUEFUVEVSTi5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yICggaSA9IG9mZnNldDsgaSA8IHNlbGYuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBjb2RlcmFuZ2U7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX21hdGNoUGF0dGVybihjb3VudGVyLCBzZWxmLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciA+IHNlbGYuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuRUFOUmVhZGVyLnByb3RvdHlwZS5fZmluZFBhdHRlcm4gPSBmdW5jdGlvbihwYXR0ZXJuLCBvZmZzZXQsIGlzV2hpdGUsIHRyeUhhcmRlciwgZXBzaWxvbikge1xuICAgIHZhciBjb3VudGVyID0gW10sXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBpLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBqLFxuICAgICAgICBzdW07XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3Jvdyk7XG4gICAgfVxuXG4gICAgaWYgKGlzV2hpdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpc1doaXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRyeUhhcmRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeUhhcmRlciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCBlcHNpbG9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXBzaWxvbiA9IHNlbGYuQVZHX0NPREVfRVJST1I7XG4gICAgfVxuXG4gICAgZm9yICggaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvdW50ZXJbaV0gPSAwO1xuICAgIH1cblxuICAgIGZvciAoIGkgPSBvZmZzZXQ7IGkgPCBzZWxmLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgY291bnRlci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY291bnRlcltqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBzZWxmLl9tYXRjaFBhdHRlcm4oY291bnRlciwgcGF0dGVybik7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRyeUhhcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoIC0gMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDJdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5FQU5SZWFkZXIucHJvdG90eXBlLl9maW5kU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX25leHRTZXQoc2VsZi5fcm93KSxcbiAgICAgICAgc3RhcnRJbmZvO1xuXG4gICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgc3RhcnRJbmZvID0gc2VsZi5fZmluZFBhdHRlcm4oc2VsZi5TVEFSVF9QQVRURVJOLCBvZmZzZXQpO1xuICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KTtcbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX21hdGNoUmFuZ2UobGVhZGluZ1doaXRlc3BhY2VTdGFydCwgc3RhcnRJbmZvLnN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ID0gc3RhcnRJbmZvLmVuZDtcbiAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICB9XG59O1xuXG5FQU5SZWFkZXIucHJvdG90eXBlLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UgPSBmdW5jdGlvbihlbmRJbmZvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQ7XG5cbiAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpO1xuICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCBzZWxmLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgIGlmIChzZWxmLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkVBTlJlYWRlci5wcm90b3R5cGUuX2ZpbmRFbmQgPSBmdW5jdGlvbihvZmZzZXQsIGlzV2hpdGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGVuZEluZm8gPSBzZWxmLl9maW5kUGF0dGVybihzZWxmLlNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBpc1doaXRlLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHNlbGYuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG59O1xuXG5FQU5SZWFkZXIucHJvdG90eXBlLl9jYWxjdWxhdGVGaXJzdERpZ2l0ID0gZnVuY3Rpb24oY29kZUZyZXF1ZW5jeSkge1xuICAgIHZhciBpLFxuICAgICAgICBzZWxmID0gdGhpcztcblxuICAgIGZvciAoIGkgPSAwOyBpIDwgc2VsZi5DT0RFX0ZSRVFVRU5DWS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gc2VsZi5DT0RFX0ZSRVFVRU5DWVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5FQU5SZWFkZXIucHJvdG90eXBlLl9kZWNvZGVQYXlsb2FkID0gZnVuY3Rpb24oY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIGNvZGVGcmVxdWVuY3kgPSAweDAsXG4gICAgICAgIGZpcnN0RGlnaXQ7XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBjb2RlID0gc2VsZi5fZGVjb2RlQ29kZShjb2RlLmVuZCk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUuY29kZSA+PSBzZWxmLkNPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgY29kZS5jb2RlID0gY29kZS5jb2RlIC0gc2VsZi5DT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDEgPDwgKDUgLSBpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMCA8PCAoNSAtIGkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgIH1cblxuICAgIGZpcnN0RGlnaXQgPSBzZWxmLl9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3kpO1xuICAgIGlmIChmaXJzdERpZ2l0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXN1bHQudW5zaGlmdChmaXJzdERpZ2l0KTtcblxuICAgIGNvZGUgPSBzZWxmLl9maW5kUGF0dGVybihzZWxmLk1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgdHJ1ZSwgZmFsc2UpO1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgIGZvciAoIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBzZWxmLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCBzZWxmLkNPREVfR19TVEFSVCk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGU7XG59O1xuXG5FQU5SZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhcnRJbmZvLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgY29kZSxcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGRlY29kZWRDb2RlcyA9IFtdLFxuICAgICAgICByZXN1bHRJbmZvID0ge307XG5cbiAgICBzdGFydEluZm8gPSBzZWxmLl9maW5kU3RhcnQoKTtcbiAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29kZSA9IHtcbiAgICAgICAgY29kZTogc3RhcnRJbmZvLmNvZGUsXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgIGVuZDogc3RhcnRJbmZvLmVuZFxuICAgIH07XG4gICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgY29kZSA9IHNlbGYuX2RlY29kZVBheWxvYWQoY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29kZSA9IHNlbGYuX2ZpbmRFbmQoY29kZS5lbmQsIGZhbHNlKTtcbiAgICBpZiAoIWNvZGUpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgIC8vIENoZWNrc3VtXG4gICAgaWYgKCFzZWxmLl9jaGVja3N1bShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGV4dCA9IHRoaXMuX2RlY29kZUV4dGVuc2lvbnMoY29kZS5lbmQpO1xuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3RDb2RlID0gZXh0LmRlY29kZWRDb2Rlc1tleHQuZGVjb2RlZENvZGVzLmxlbmd0aC0xXSxcbiAgICAgICAgICAgIGVuZEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGxhc3RDb2RlLnN0YXJ0ICsgKCgobGFzdENvZGUuZW5kIC0gbGFzdENvZGUuc3RhcnQpIC8gMikgfCAwKSxcbiAgICAgICAgICAgICAgICBlbmQ6IGxhc3RDb2RlLmVuZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgaWYoIXNlbGYuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0SW5mbyA9IHtcbiAgICAgICAgICAgIHN1cHBsZW1lbnQ6IGV4dCxcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKFwiXCIpICsgZXh0LmNvZGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKFwiXCIpLFxuICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICBlbmQ6IGNvZGUuZW5kLFxuICAgICAgICBjb2Rlc2V0OiBcIlwiLFxuICAgICAgICBzdGFydEluZm86IHN0YXJ0SW5mbyxcbiAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXMsXG4gICAgICAgIC4uLnJlc3VsdEluZm9cbiAgICB9O1xufTtcblxuRUFOUmVhZGVyLnByb3RvdHlwZS5fZGVjb2RlRXh0ZW5zaW9ucyA9IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgIHZhciBpLFxuICAgICAgICBzdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBvZmZzZXQpLFxuICAgICAgICBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLkVYVEVOU0lPTl9TVEFSVF9QQVRURVJOLCBzdGFydCwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdXBwbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnN1cHBsZW1lbnRzW2ldLmRlY29kZSh0aGlzLl9yb3csIHN0YXJ0SW5mby5lbmQpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICBlbmQ6IHJlc3VsdC5lbmQsXG4gICAgICAgICAgICAgICAgY29kZXNldDogXCJcIixcbiAgICAgICAgICAgICAgICBkZWNvZGVkQ29kZXM6IHJlc3VsdC5kZWNvZGVkQ29kZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkVBTlJlYWRlci5wcm90b3R5cGUuX2NoZWNrc3VtID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgdmFyIHN1bSA9IDAsIGk7XG5cbiAgICBmb3IgKCBpID0gcmVzdWx0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgfVxuICAgIHN1bSAqPSAzO1xuICAgIGZvciAoIGkgPSByZXN1bHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bSAlIDEwID09PSAwO1xufTtcblxuRUFOUmVhZGVyLkNPTkZJR19LRVlTID0ge1xuICAgIHN1cHBsZW1lbnRzOiB7XG4gICAgICAgICd0eXBlJzogJ2FycmF5T2Yoc3RyaW5nKScsXG4gICAgICAgICdkZWZhdWx0JzogW10sXG4gICAgICAgICdkZXNjcmlwdGlvbic6ICdBbGxvd2VkIGV4dGVuc2lvbnMgdG8gYmUgZGVjb2RlZCAoMiBhbmQvb3IgNSknXG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgKEVBTlJlYWRlcik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhZGVyL2Vhbl9yZWFkZXIuanMiLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19yb290LmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXG4gKi9cbmZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSgyKVxuICAgIG91dFswXSA9IGFbMF1cbiAgICBvdXRbMV0gPSBhWzFdXG4gICAgcmV0dXJuIG91dFxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9nbC12ZWMyL2Nsb25lLmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlR2V0VGFnLmpzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICBkcmF3UmVjdDogZnVuY3Rpb24ocG9zLCBzaXplLCBjdHgsIHN0eWxlKXtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3R5bGUuY29sb3I7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LnN0cm9rZVJlY3QocG9zLngsIHBvcy55LCBzaXplLngsIHNpemUueSk7XG4gICAgfSxcbiAgICBkcmF3UGF0aDogZnVuY3Rpb24ocGF0aCwgZGVmLCBjdHgsIHN0eWxlKSB7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gc3R5bGUuY29sb3I7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBzdHlsZS5saW5lV2lkdGg7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyhwYXRoWzBdW2RlZi54XSwgcGF0aFswXVtkZWYueV0pO1xuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocGF0aFtqXVtkZWYueF0sIHBhdGhbal1bZGVmLnldKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9LFxuICAgIGRyYXdJbWFnZTogZnVuY3Rpb24oaW1hZ2VEYXRhLCBzaXplLCBjdHgpIHtcbiAgICAgICAgdmFyIGNhbnZhc0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHNpemUueCwgc2l6ZS55KSxcbiAgICAgICAgICAgIGRhdGEgPSBjYW52YXNEYXRhLmRhdGEsXG4gICAgICAgICAgICBpbWFnZURhdGFQb3MgPSBpbWFnZURhdGEubGVuZ3RoLFxuICAgICAgICAgICAgY2FudmFzRGF0YVBvcyA9IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgdmFsdWU7XG5cbiAgICAgICAgaWYgKGNhbnZhc0RhdGFQb3MgLyBpbWFnZURhdGFQb3MgIT09IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoaW1hZ2VEYXRhUG9zLS0pe1xuICAgICAgICAgICAgdmFsdWUgPSBpbWFnZURhdGFbaW1hZ2VEYXRhUG9zXTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IDI1NTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IHZhbHVlO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0RhdGFQb3NdID0gdmFsdWU7XG4gICAgICAgICAgICBkYXRhWy0tY2FudmFzRGF0YVBvc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0RhdGEsIDAsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9pbWFnZV9kZWJ1Zy5qcyIsInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19MaXN0Q2FjaGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19TeW1ib2wuanNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hc3NvY0luZGV4T2YuanNcbi8vIG1vZHVsZSBpZCA9IDEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2FzdFBhdGguanNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRNYXBEYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faXNJbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2VxLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQXJndW1lbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgQ2x1c3RlcjIgZnJvbSAnLi9jbHVzdGVyJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuL2FycmF5X2hlbHBlcic7XG5jb25zdCB2ZWMyID0ge1xuICAgIGNsb25lOiByZXF1aXJlKCdnbC12ZWMyL2Nsb25lJyksXG59O1xuY29uc3QgdmVjMyA9IHtcbiAgICBjbG9uZTogcmVxdWlyZSgnZ2wtdmVjMy9jbG9uZScpLFxufTtcblxuLyoqXG4gKiBAcGFyYW0geCB4LWNvb3JkaW5hdGVcbiAqIEBwYXJhbSB5IHktY29vcmRpbmF0ZVxuICogQHJldHVybiBJbWFnZVJlZmVyZW5jZSB7eCx5fSBDb29yZGluYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZVJlZih4LCB5KSB7XG4gICAgdmFyIHRoYXQgPSB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHRvVmVjMjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdmVjMi5jbG9uZShbdGhpcy54LCB0aGlzLnldKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9WZWMzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB2ZWMzLmNsb25lKFt0aGlzLngsIHRoaXMueSwgMV0pO1xuICAgICAgICB9LFxuICAgICAgICByb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnggPSB0aGlzLnggPiAwLjAgPyBNYXRoLmZsb29yKHRoaXMueCArIDAuNSkgOiBNYXRoLmZsb29yKHRoaXMueCAtIDAuNSk7XG4gICAgICAgICAgICB0aGlzLnkgPSB0aGlzLnkgPiAwLjAgPyBNYXRoLmZsb29yKHRoaXMueSArIDAuNSkgOiBNYXRoLmZsb29yKHRoaXMueSAtIDAuNSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoYXQ7XG59O1xuXG4vKipcbiAqIENvbXB1dGVzIGFuIGludGVncmFsIGltYWdlIG9mIGEgZ2l2ZW4gZ3JheXNjYWxlIGltYWdlLlxuICogQHBhcmFtIGltYWdlRGF0YUNvbnRhaW5lciB7SW1hZ2VEYXRhQ29udGFpbmVyfSB0aGUgaW1hZ2UgdG8gYmUgaW50ZWdyYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUludGVncmFsSW1hZ2UyKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyKSB7XG4gICAgdmFyIGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIHZhciB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgdmFyIGhlaWdodCA9IGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgdmFyIGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgdmFyIHN1bSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMCwgcG9zQyA9IDAsIHBvc0QgPSAwLCB4LCB5O1xuXG4gICAgLy8gc3VtIHVwIGZpcnN0IGNvbHVtblxuICAgIHBvc0IgPSB3aWR0aDtcbiAgICBzdW0gPSAwO1xuICAgIGZvciAoIHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtwb3NBXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbcG9zQl0gKz0gc3VtO1xuICAgICAgICBwb3NBICs9IHdpZHRoO1xuICAgICAgICBwb3NCICs9IHdpZHRoO1xuICAgIH1cblxuICAgIHBvc0EgPSAwO1xuICAgIHBvc0IgPSAxO1xuICAgIHN1bSA9IDA7XG4gICAgZm9yICggeCA9IDE7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIHN1bSArPSBpbWFnZURhdGFbcG9zQV07XG4gICAgICAgIGludGVncmFsSW1hZ2VEYXRhW3Bvc0JdICs9IHN1bTtcbiAgICAgICAgcG9zQSsrO1xuICAgICAgICBwb3NCKys7XG4gICAgfVxuXG4gICAgZm9yICggeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBwb3NBID0geSAqIHdpZHRoICsgMTtcbiAgICAgICAgcG9zQiA9ICh5IC0gMSkgKiB3aWR0aCArIDE7XG4gICAgICAgIHBvc0MgPSB5ICogd2lkdGg7XG4gICAgICAgIHBvc0QgPSAoeSAtIDEpICogd2lkdGg7XG4gICAgICAgIGZvciAoIHggPSAxOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbcG9zQV0gKz1cbiAgICAgICAgICAgICAgICBpbWFnZURhdGFbcG9zQV0gKyBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArIGludGVncmFsSW1hZ2VEYXRhW3Bvc0NdIC0gaW50ZWdyYWxJbWFnZURhdGFbcG9zRF07XG4gICAgICAgICAgICBwb3NBKys7XG4gICAgICAgICAgICBwb3NCKys7XG4gICAgICAgICAgICBwb3NDKys7XG4gICAgICAgICAgICBwb3NEKys7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUludGVncmFsSW1hZ2UoaW1hZ2VXcmFwcGVyLCBpbnRlZ3JhbFdyYXBwZXIpIHtcbiAgICB2YXIgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgdmFyIHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICB2YXIgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICB2YXIgaW50ZWdyYWxJbWFnZURhdGEgPSBpbnRlZ3JhbFdyYXBwZXIuZGF0YTtcbiAgICB2YXIgc3VtID0gMDtcblxuICAgIC8vIHN1bSB1cCBmaXJzdCByb3dcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtpXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbaV0gPSBzdW07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgdiA9IDE7IHYgPCBoZWlnaHQ7IHYrKykge1xuICAgICAgICBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAgIHN1bSArPSBpbWFnZURhdGFbdiAqIHdpZHRoICsgdV07XG4gICAgICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSBzdW0gKyBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIDEpICogd2lkdGggKyB1XTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJlc2hvbGRJbWFnZShpbWFnZVdyYXBwZXIsIHRocmVzaG9sZCwgdGFyZ2V0V3JhcHBlcikge1xuICAgIGlmICghdGFyZ2V0V3JhcHBlcikge1xuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICB2YXIgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGEsIGxlbmd0aCA9IGltYWdlRGF0YS5sZW5ndGgsIHRhcmdldERhdGEgPSB0YXJnZXRXcmFwcGVyLmRhdGE7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdGFyZ2V0RGF0YVtsZW5ndGhdID0gaW1hZ2VEYXRhW2xlbmd0aF0gPCB0aHJlc2hvbGQgPyAxIDogMDtcbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCkge1xuICAgIGlmICghYml0c1BlclBpeGVsKSB7XG4gICAgICAgIGJpdHNQZXJQaXhlbCA9IDg7XG4gICAgfVxuICAgIHZhciBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgbGVuZ3RoID0gaW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgICAgYml0U2hpZnQgPSA4IC0gYml0c1BlclBpeGVsLFxuICAgICAgICBidWNrZXRDbnQgPSAxIDw8IGJpdHNQZXJQaXhlbCxcbiAgICAgICAgaGlzdCA9IG5ldyBJbnQzMkFycmF5KGJ1Y2tldENudCk7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaGlzdFtpbWFnZURhdGFbbGVuZ3RoXSA+PiBiaXRTaGlmdF0rKztcbiAgICB9XG4gICAgcmV0dXJuIGhpc3Q7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2hhcnBlbkxpbmUobGluZSkge1xuICAgIHZhciBpLFxuICAgICAgICBsZW5ndGggPSBsaW5lLmxlbmd0aCxcbiAgICAgICAgbGVmdCA9IGxpbmVbMF0sXG4gICAgICAgIGNlbnRlciA9IGxpbmVbMV0sXG4gICAgICAgIHJpZ2h0O1xuXG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICByaWdodCA9IGxpbmVbaSArIDFdO1xuICAgICAgICAvLyAgLTEgNCAtMSBrZXJuZWxcbiAgICAgICAgbGluZVtpIC0gMV0gPSAoKChjZW50ZXIgKiAyKSAtIGxlZnQgLSByaWdodCkpICYgMjU1O1xuICAgICAgICBsZWZ0ID0gY2VudGVyO1xuICAgICAgICBjZW50ZXIgPSByaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lT3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCkge1xuICAgIGlmICghYml0c1BlclBpeGVsKSB7XG4gICAgICAgIGJpdHNQZXJQaXhlbCA9IDg7XG4gICAgfVxuICAgIHZhciBoaXN0LFxuICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgIGJpdFNoaWZ0ID0gOCAtIGJpdHNQZXJQaXhlbDtcblxuICAgIGZ1bmN0aW9uIHB4KGluaXQsIGVuZCkge1xuICAgICAgICB2YXIgc3VtID0gMCwgaTtcbiAgICAgICAgZm9yICggaSA9IGluaXQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBoaXN0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbXgoaW5pdCwgZW5kKSB7XG4gICAgICAgIHZhciBpLCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAoIGkgPSBpbml0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaSAqIGhpc3RbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRldGVybWluZVRocmVzaG9sZCgpIHtcbiAgICAgICAgdmFyIHZldCA9IFswXSwgcDEsIHAyLCBwMTIsIGssIG0xLCBtMiwgbTEyLFxuICAgICAgICAgICAgbWF4ID0gKDEgPDwgYml0c1BlclBpeGVsKSAtIDE7XG5cbiAgICAgICAgaGlzdCA9IGNvbXB1dGVIaXN0b2dyYW0oaW1hZ2VXcmFwcGVyLCBiaXRzUGVyUGl4ZWwpO1xuICAgICAgICBmb3IgKCBrID0gMTsgayA8IG1heDsgaysrKSB7XG4gICAgICAgICAgICBwMSA9IHB4KDAsIGspO1xuICAgICAgICAgICAgcDIgPSBweChrICsgMSwgbWF4KTtcbiAgICAgICAgICAgIHAxMiA9IHAxICogcDI7XG4gICAgICAgICAgICBpZiAocDEyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcDEyID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG0xID0gbXgoMCwgaykgKiBwMjtcbiAgICAgICAgICAgIG0yID0gbXgoayArIDEsIG1heCkgKiBwMTtcbiAgICAgICAgICAgIG0xMiA9IG0xIC0gbTI7XG4gICAgICAgICAgICB2ZXRba10gPSBtMTIgKiBtMTIgLyBwMTI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyLm1heEluZGV4KHZldCk7XG4gICAgfVxuXG4gICAgdGhyZXNob2xkID0gZGV0ZXJtaW5lVGhyZXNob2xkKCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCA8PCBiaXRTaGlmdDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvdHN1VGhyZXNob2xkKGltYWdlV3JhcHBlciwgdGFyZ2V0V3JhcHBlcikge1xuICAgIHZhciB0aHJlc2hvbGQgPSBkZXRlcm1pbmVPdHN1VGhyZXNob2xkKGltYWdlV3JhcHBlcik7XG5cbiAgICB0aHJlc2hvbGRJbWFnZShpbWFnZVdyYXBwZXIsIHRocmVzaG9sZCwgdGFyZ2V0V3JhcHBlcik7XG4gICAgcmV0dXJuIHRocmVzaG9sZDtcbn07XG5cbi8vIGxvY2FsIHRocmVzaG9sZGluZ1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCaW5hcnlJbWFnZShpbWFnZVdyYXBwZXIsIGludGVncmFsV3JhcHBlciwgdGFyZ2V0V3JhcHBlcikge1xuICAgIGNvbXB1dGVJbnRlZ3JhbEltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyKTtcblxuICAgIGlmICghdGFyZ2V0V3JhcHBlcikge1xuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICB2YXIgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgdmFyIHRhcmdldERhdGEgPSB0YXJnZXRXcmFwcGVyLmRhdGE7XG4gICAgdmFyIHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICB2YXIgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICB2YXIgaW50ZWdyYWxJbWFnZURhdGEgPSBpbnRlZ3JhbFdyYXBwZXIuZGF0YTtcbiAgICB2YXIgc3VtID0gMCwgdiwgdSwga2VybmVsID0gMywgQSwgQiwgQywgRCwgYXZnLCBzaXplID0gKGtlcm5lbCAqIDIgKyAxKSAqIChrZXJuZWwgKiAyICsgMSk7XG5cbiAgICAvLyBjbGVhciBvdXQgdG9wICYgYm90dG9tLWJvcmRlclxuICAgIGZvciAoIHYgPSAwOyB2IDw9IGtlcm5lbDsgdisrKSB7XG4gICAgICAgIGZvciAoIHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKChoZWlnaHQgLSAxKSAtIHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgb3V0IGxlZnQgJiByaWdodCBib3JkZXJcbiAgICBmb3IgKCB2ID0ga2VybmVsOyB2IDwgaGVpZ2h0IC0ga2VybmVsOyB2KyspIHtcbiAgICAgICAgZm9yICggdSA9IDA7IHUgPD0ga2VybmVsOyB1KyspIHtcbiAgICAgICAgICAgIHRhcmdldERhdGFbKCh2KSAqIHdpZHRoKSArIHVdID0gMDtcbiAgICAgICAgICAgIHRhcmdldERhdGFbKCh2KSAqIHdpZHRoKSArICh3aWR0aCAtIDEgLSB1KV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICggdiA9IGtlcm5lbCArIDE7IHYgPCBoZWlnaHQgLSBrZXJuZWwgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICggdSA9IGtlcm5lbCArIDE7IHUgPCB3aWR0aCAtIGtlcm5lbDsgdSsrKSB7XG4gICAgICAgICAgICBBID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgLSBrZXJuZWwgLSAxKSAqIHdpZHRoICsgKHUgLSBrZXJuZWwgLSAxKV07XG4gICAgICAgICAgICBCID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgLSBrZXJuZWwgLSAxKSAqIHdpZHRoICsgKHUgKyBrZXJuZWwpXTtcbiAgICAgICAgICAgIEMgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiArIGtlcm5lbCkgKiB3aWR0aCArICh1IC0ga2VybmVsIC0gMSldO1xuICAgICAgICAgICAgRCA9IGludGVncmFsSW1hZ2VEYXRhWyh2ICsga2VybmVsKSAqIHdpZHRoICsgKHUgKyBrZXJuZWwpXTtcbiAgICAgICAgICAgIHN1bSA9IEQgLSBDIC0gQiArIEE7XG4gICAgICAgICAgICBhdmcgPSBzdW0gLyAoc2l6ZSk7XG4gICAgICAgICAgICB0YXJnZXREYXRhW3YgKiB3aWR0aCArIHVdID0gaW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID4gKGF2ZyArIDUpID8gMCA6IDE7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlcihwb2ludHMsIHRocmVzaG9sZCwgcHJvcGVydHkpIHtcbiAgICB2YXIgaSwgaywgY2x1c3RlciwgcG9pbnQsIGNsdXN0ZXJzID0gW107XG5cbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIHByb3BlcnR5ID0gXCJyYWRcIjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUb0NsdXN0ZXIobmV3UG9pbnQpIHtcbiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoIGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNsdXN0ZXIgPSBjbHVzdGVyc1trXTtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyLmZpdHMobmV3UG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlci5hZGQobmV3UG9pbnQpO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGVhY2ggY2xvdWRcbiAgICBmb3IgKCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwb2ludCA9IENsdXN0ZXIyLmNyZWF0ZVBvaW50KHBvaW50c1tpXSwgaSwgcHJvcGVydHkpO1xuICAgICAgICBpZiAoIWFkZFRvQ2x1c3Rlcihwb2ludCkpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goQ2x1c3RlcjIuY3JlYXRlKHBvaW50LCB0aHJlc2hvbGQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG5leHBvcnQgY29uc3QgVHJhY2VyID0ge1xuICAgIHRyYWNlOiBmdW5jdGlvbihwb2ludHMsIHZlYykge1xuICAgICAgICB2YXIgaXRlcmF0aW9uLCBtYXhJdGVyYXRpb25zID0gMTAsIHRvcCA9IFtdLCByZXN1bHQgPSBbXSwgY2VudGVyUG9zID0gMCwgY3VycmVudFBvcyA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gdHJhY2UoaWR4LCBmb3J3YXJkKSB7XG4gICAgICAgICAgICB2YXIgZnJvbSwgdG8sIHRvSWR4LCBwcmVkaWN0ZWRQb3MsIHRocmVzaG9sZFggPSAxLCB0aHJlc2hvbGRZID0gTWF0aC5hYnModmVjWzFdIC8gMTApLCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBtYXRjaChwb3MsIHByZWRpY3RlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwb3MueCA+IChwcmVkaWN0ZWQueCAtIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueCA8IChwcmVkaWN0ZWQueCArIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA+IChwcmVkaWN0ZWQueSAtIHRocmVzaG9sZFkpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA8IChwcmVkaWN0ZWQueSArIHRocmVzaG9sZFkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IGluZGV4IGlzIHdpdGhpbiB0aGUgdmVjIHNwZWNpZmljYXRpb25zXG4gICAgICAgICAgICAvLyBpZiBub3QsIGNoZWNrIGFzIGxvbmcgYXMgdGhlIHRocmVzaG9sZCBpcyBtZXRcblxuICAgICAgICAgICAgZnJvbSA9IHBvaW50c1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZvcndhcmQpIHtcbiAgICAgICAgICAgICAgICBwcmVkaWN0ZWRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGZyb20ueCArIHZlY1swXSxcbiAgICAgICAgICAgICAgICAgICAgeTogZnJvbS55ICsgdmVjWzFdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlZGljdGVkUG9zID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggLSB2ZWNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSAtIHZlY1sxXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvSWR4ID0gZm9yd2FyZCA/IGlkeCArIDEgOiBpZHggLSAxO1xuICAgICAgICAgICAgdG8gPSBwb2ludHNbdG9JZHhdO1xuICAgICAgICAgICAgd2hpbGUgKHRvICYmICggZm91bmQgPSBtYXRjaCh0bywgcHJlZGljdGVkUG9zKSkgIT09IHRydWUgJiYgKE1hdGguYWJzKHRvLnkgLSBmcm9tLnkpIDwgdmVjWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvSWR4ID0gZm9yd2FyZCA/IHRvSWR4ICsgMSA6IHRvSWR4IC0gMTtcbiAgICAgICAgICAgICAgICB0byA9IHBvaW50c1t0b0lkeF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3VuZCA/IHRvSWR4IDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IG1heEl0ZXJhdGlvbnM7IGl0ZXJhdGlvbisrKSB7XG4gICAgICAgICAgICAvLyByYW5kb21seSBzZWxlY3QgcG9pbnQgdG8gc3RhcnQgd2l0aFxuICAgICAgICAgICAgY2VudGVyUG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9pbnRzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIC8vIHRyYWNlIGZvcndhcmRcbiAgICAgICAgICAgIHRvcCA9IFtdO1xuICAgICAgICAgICAgY3VycmVudFBvcyA9IGNlbnRlclBvcztcbiAgICAgICAgICAgIHRvcC5wdXNoKHBvaW50c1tjdXJyZW50UG9zXSk7XG4gICAgICAgICAgICB3aGlsZSAoKCBjdXJyZW50UG9zID0gdHJhY2UoY3VycmVudFBvcywgdHJ1ZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdG9wLnB1c2gocG9pbnRzW2N1cnJlbnRQb3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjZW50ZXJQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBvcyA9IGNlbnRlclBvcztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKCBjdXJyZW50UG9zID0gdHJhY2UoY3VycmVudFBvcywgZmFsc2UpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0b3AucHVzaChwb2ludHNbY3VycmVudFBvc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRvcC5sZW5ndGggPiByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IERJTEFURSA9IDE7XG5leHBvcnQgY29uc3QgRVJPREUgPSAyO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXIpIHtcbiAgICB2YXIgdixcbiAgICAgICAgdSxcbiAgICAgICAgaW5JbWFnZURhdGEgPSBpbkltYWdlV3JhcHBlci5kYXRhLFxuICAgICAgICBvdXRJbWFnZURhdGEgPSBvdXRJbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgaGVpZ2h0ID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS55LFxuICAgICAgICB3aWR0aCA9IGluSW1hZ2VXcmFwcGVyLnNpemUueCxcbiAgICAgICAgc3VtLFxuICAgICAgICB5U3RhcnQxLFxuICAgICAgICB5U3RhcnQyLFxuICAgICAgICB4U3RhcnQxLFxuICAgICAgICB4U3RhcnQyO1xuXG4gICAgZm9yICggdiA9IDE7IHYgPCBoZWlnaHQgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICggdSA9IDE7IHUgPCB3aWR0aCAtIDE7IHUrKykge1xuICAgICAgICAgICAgeVN0YXJ0MSA9IHYgLSAxO1xuICAgICAgICAgICAgeVN0YXJ0MiA9IHYgKyAxO1xuICAgICAgICAgICAgeFN0YXJ0MSA9IHUgLSAxO1xuICAgICAgICAgICAgeFN0YXJ0MiA9IHUgKyAxO1xuICAgICAgICAgICAgc3VtID0gaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQyXSArXG4gICAgICAgICAgICBpbkltYWdlRGF0YVt2ICogd2lkdGggKyB1XSArXG4gICAgICAgICAgICBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDJdO1xuICAgICAgICAgICAgb3V0SW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID0gc3VtID4gMCA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVyb2RlKGluSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXIpIHtcbiAgICB2YXIgdixcbiAgICAgICAgdSxcbiAgICAgICAgaW5JbWFnZURhdGEgPSBpbkltYWdlV3JhcHBlci5kYXRhLFxuICAgICAgICBvdXRJbWFnZURhdGEgPSBvdXRJbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgaGVpZ2h0ID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS55LFxuICAgICAgICB3aWR0aCA9IGluSW1hZ2VXcmFwcGVyLnNpemUueCxcbiAgICAgICAgc3VtLFxuICAgICAgICB5U3RhcnQxLFxuICAgICAgICB5U3RhcnQyLFxuICAgICAgICB4U3RhcnQxLFxuICAgICAgICB4U3RhcnQyO1xuXG4gICAgZm9yICggdiA9IDE7IHYgPCBoZWlnaHQgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICggdSA9IDE7IHUgPCB3aWR0aCAtIDE7IHUrKykge1xuICAgICAgICAgICAgeVN0YXJ0MSA9IHYgLSAxO1xuICAgICAgICAgICAgeVN0YXJ0MiA9IHYgKyAxO1xuICAgICAgICAgICAgeFN0YXJ0MSA9IHUgLSAxO1xuICAgICAgICAgICAgeFN0YXJ0MiA9IHUgKyAxO1xuICAgICAgICAgICAgc3VtID0gaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQyXSArXG4gICAgICAgICAgICBpbkltYWdlRGF0YVt2ICogd2lkdGggKyB1XSArXG4gICAgICAgICAgICBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDJdO1xuICAgICAgICAgICAgb3V0SW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID0gc3VtID09PSA1ID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3QoYUltYWdlV3JhcHBlciwgYkltYWdlV3JhcHBlciwgcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgaWYgKCFyZXN1bHRJbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgcmVzdWx0SW1hZ2VXcmFwcGVyID0gYUltYWdlV3JhcHBlcjtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGFJbWFnZVdyYXBwZXIuZGF0YS5sZW5ndGgsXG4gICAgICAgIGFJbWFnZURhdGEgPSBhSW1hZ2VXcmFwcGVyLmRhdGEsXG4gICAgICAgIGJJbWFnZURhdGEgPSBiSW1hZ2VXcmFwcGVyLmRhdGEsXG4gICAgICAgIGNJbWFnZURhdGEgPSByZXN1bHRJbWFnZVdyYXBwZXIuZGF0YTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBjSW1hZ2VEYXRhW2xlbmd0aF0gPSBhSW1hZ2VEYXRhW2xlbmd0aF0gLSBiSW1hZ2VEYXRhW2xlbmd0aF07XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpdHdpc2VPcihhSW1hZ2VXcmFwcGVyLCBiSW1hZ2VXcmFwcGVyLCByZXN1bHRJbWFnZVdyYXBwZXIpIHtcbiAgICBpZiAoIXJlc3VsdEltYWdlV3JhcHBlcikge1xuICAgICAgICByZXN1bHRJbWFnZVdyYXBwZXIgPSBhSW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYUltYWdlV3JhcHBlci5kYXRhLmxlbmd0aCxcbiAgICAgICAgYUltYWdlRGF0YSA9IGFJbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgYkltYWdlRGF0YSA9IGJJbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgY0ltYWdlRGF0YSA9IHJlc3VsdEltYWdlV3JhcHBlci5kYXRhO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGNJbWFnZURhdGFbbGVuZ3RoXSA9IGFJbWFnZURhdGFbbGVuZ3RoXSB8fCBiSW1hZ2VEYXRhW2xlbmd0aF07XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm9uWmVybyhpbWFnZVdyYXBwZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gaW1hZ2VXcmFwcGVyLmRhdGEubGVuZ3RoLCBkYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGEsIHN1bSA9IDA7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgc3VtICs9IGRhdGFbbGVuZ3RoXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3BHZW5lcmljKGxpc3QsIHRvcCwgc2NvcmVGdW5jKSB7XG4gICAgdmFyIGksIG1pbklkeCA9IDAsIG1pbiA9IDAsIHF1ZXVlID0gW10sIHNjb3JlLCBoaXQsIHBvcztcblxuICAgIGZvciAoIGkgPSAwOyBpIDwgdG9wOyBpKyspIHtcbiAgICAgICAgcXVldWVbaV0gPSB7XG4gICAgICAgICAgICBzY29yZTogMCxcbiAgICAgICAgICAgIGl0ZW06IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2NvcmUgPSBzY29yZUZ1bmMuYXBwbHkodGhpcywgW2xpc3RbaV1dKTtcbiAgICAgICAgaWYgKHNjb3JlID4gbWluKSB7XG4gICAgICAgICAgICBoaXQgPSBxdWV1ZVttaW5JZHhdO1xuICAgICAgICAgICAgaGl0LnNjb3JlID0gc2NvcmU7XG4gICAgICAgICAgICBoaXQuaXRlbSA9IGxpc3RbaV07XG4gICAgICAgICAgICBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgZm9yICggcG9zID0gMDsgcG9zIDwgdG9wOyBwb3MrKykge1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZVtwb3NdLnNjb3JlIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IHF1ZXVlW3Bvc10uc2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIG1pbklkeCA9IHBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ3JheUFycmF5RnJvbUltYWdlKGh0bWxJbWFnZSwgb2Zmc2V0WCwgY3R4LCBhcnJheSkge1xuICAgIGN0eC5kcmF3SW1hZ2UoaHRtbEltYWdlLCBvZmZzZXRYLCAwLCBodG1sSW1hZ2Uud2lkdGgsIGh0bWxJbWFnZS5oZWlnaHQpO1xuICAgIHZhciBjdHhEYXRhID0gY3R4LmdldEltYWdlRGF0YShvZmZzZXRYLCAwLCBodG1sSW1hZ2Uud2lkdGgsIGh0bWxJbWFnZS5oZWlnaHQpLmRhdGE7XG4gICAgY29tcHV0ZUdyYXkoY3R4RGF0YSwgYXJyYXkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXlBcnJheUZyb21Db250ZXh0KGN0eCwgc2l6ZSwgb2Zmc2V0LCBhcnJheSkge1xuICAgIHZhciBjdHhEYXRhID0gY3R4LmdldEltYWdlRGF0YShvZmZzZXQueCwgb2Zmc2V0LnksIHNpemUueCwgc2l6ZS55KS5kYXRhO1xuICAgIGNvbXB1dGVHcmF5KGN0eERhdGEsIGFycmF5KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhKGNhbnZhc0RhdGEsIHNpemUsIG91dEFycmF5KSB7XG4gICAgdmFyIHRvcFJvd0lkeCA9IDA7XG4gICAgdmFyIGJvdHRvbVJvd0lkeCA9IHNpemUueDtcbiAgICB2YXIgZW5kSWR4ID0gTWF0aC5mbG9vcihjYW52YXNEYXRhLmxlbmd0aCAvIDQpO1xuICAgIHZhciBvdXRXaWR0aCA9IHNpemUueCAvIDI7XG4gICAgdmFyIG91dEltZ0lkeCA9IDA7XG4gICAgdmFyIGluV2lkdGggPSBzaXplLng7XG4gICAgdmFyIGk7XG5cbiAgICB3aGlsZSAoYm90dG9tUm93SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgb3V0V2lkdGg7IGkrKykge1xuICAgICAgICAgICAgb3V0QXJyYXlbb3V0SW1nSWR4XSA9IChcbiAgICAgICAgICAgICAgICAoMC4yOTkgKiBjYW52YXNEYXRhW3RvcFJvd0lkeCAqIDQgKyAwXSArXG4gICAgICAgICAgICAgICAgIDAuNTg3ICogY2FudmFzRGF0YVt0b3BSb3dJZHggKiA0ICsgMV0gK1xuICAgICAgICAgICAgICAgICAwLjExNCAqIGNhbnZhc0RhdGFbdG9wUm93SWR4ICogNCArIDJdKSArXG4gICAgICAgICAgICAgICAgKDAuMjk5ICogY2FudmFzRGF0YVsodG9wUm93SWR4ICsgMSkgKiA0ICsgMF0gK1xuICAgICAgICAgICAgICAgICAwLjU4NyAqIGNhbnZhc0RhdGFbKHRvcFJvd0lkeCArIDEpICogNCArIDFdICtcbiAgICAgICAgICAgICAgICAgMC4xMTQgKiBjYW52YXNEYXRhWyh0b3BSb3dJZHggKyAxKSAqIDQgKyAyXSkgK1xuICAgICAgICAgICAgICAgICgwLjI5OSAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMF0gK1xuICAgICAgICAgICAgICAgICAwLjU4NyAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMV0gK1xuICAgICAgICAgICAgICAgICAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMl0pICtcbiAgICAgICAgICAgICAgICAoMC4yOTkgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHggKyAxKSAqIDQgKyAwXSArXG4gICAgICAgICAgICAgICAgIDAuNTg3ICogY2FudmFzRGF0YVsoYm90dG9tUm93SWR4ICsgMSkgKiA0ICsgMV0gK1xuICAgICAgICAgICAgICAgICAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCArIDEpICogNCArIDJdKSkgLyA0O1xuICAgICAgICAgICAgb3V0SW1nSWR4Kys7XG4gICAgICAgICAgICB0b3BSb3dJZHggPSB0b3BSb3dJZHggKyAyO1xuICAgICAgICAgICAgYm90dG9tUm93SWR4ID0gYm90dG9tUm93SWR4ICsgMjtcbiAgICAgICAgfVxuICAgICAgICB0b3BSb3dJZHggPSB0b3BSb3dJZHggKyBpbldpZHRoO1xuICAgICAgICBib3R0b21Sb3dJZHggPSBib3R0b21Sb3dJZHggKyBpbldpZHRoO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JheShpbWFnZURhdGEsIG91dEFycmF5LCBjb25maWcpIHtcbiAgICB2YXIgbCA9IChpbWFnZURhdGEubGVuZ3RoIC8gNCkgfCAwLFxuICAgICAgICBpLFxuICAgICAgICBzaW5nbGVDaGFubmVsID0gY29uZmlnICYmIGNvbmZpZy5zaW5nbGVDaGFubmVsID09PSB0cnVlO1xuXG4gICAgaWYgKHNpbmdsZUNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgb3V0QXJyYXlbaV0gPSBpbWFnZURhdGFbaSAqIDQgKyAwXTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIG91dEFycmF5W2ldID1cbiAgICAgICAgICAgICAgICAwLjI5OSAqIGltYWdlRGF0YVtpICogNCArIDBdICsgMC41ODcgKiBpbWFnZURhdGFbaSAqIDQgKyAxXSArIDAuMTE0ICogaW1hZ2VEYXRhW2kgKiA0ICsgMl07XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlQXJyYXkoc3JjLCBjYWxsYmFjaywgY2FudmFzKSB7XG4gICAgaWYgKCFjYW52YXMpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBpbWcub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKHRoaXMsIDAsIDApO1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKHRoaXMsIDAsIDApO1xuICAgICAgICB2YXIgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpLmRhdGE7XG4gICAgICAgIGNvbXB1dGVHcmF5KGRhdGEsIGFycmF5KTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhhcnJheSwge1xuICAgICAgICAgICAgeDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgIHk6IHRoaXMuaGVpZ2h0XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH07XG4gICAgaW1nLnNyYyA9IHNyYztcbn07XG5cbi8qKlxuICogQHBhcmFtIGluSW1nIHtJbWFnZVdyYXBwZXJ9IGlucHV0IGltYWdlIHRvIGJlIHNhbXBsZWRcbiAqIEBwYXJhbSBvdXRJbWcge0ltYWdlV3JhcHBlcn0gdG8gYmUgc3RvcmVkIGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYWxmU2FtcGxlKGluSW1nV3JhcHBlciwgb3V0SW1nV3JhcHBlcikge1xuICAgIHZhciBpbkltZyA9IGluSW1nV3JhcHBlci5kYXRhO1xuICAgIHZhciBpbldpZHRoID0gaW5JbWdXcmFwcGVyLnNpemUueDtcbiAgICB2YXIgb3V0SW1nID0gb3V0SW1nV3JhcHBlci5kYXRhO1xuICAgIHZhciB0b3BSb3dJZHggPSAwO1xuICAgIHZhciBib3R0b21Sb3dJZHggPSBpbldpZHRoO1xuICAgIHZhciBlbmRJZHggPSBpbkltZy5sZW5ndGg7XG4gICAgdmFyIG91dFdpZHRoID0gaW5XaWR0aCAvIDI7XG4gICAgdmFyIG91dEltZ0lkeCA9IDA7XG4gICAgd2hpbGUgKGJvdHRvbVJvd0lkeCA8IGVuZElkeCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dFdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIG91dEltZ1tvdXRJbWdJZHhdID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAoaW5JbWdbdG9wUm93SWR4XSArIGluSW1nW3RvcFJvd0lkeCArIDFdICsgaW5JbWdbYm90dG9tUm93SWR4XSArIGluSW1nW2JvdHRvbVJvd0lkeCArIDFdKSAvIDQpO1xuICAgICAgICAgICAgb3V0SW1nSWR4Kys7XG4gICAgICAgICAgICB0b3BSb3dJZHggPSB0b3BSb3dJZHggKyAyO1xuICAgICAgICAgICAgYm90dG9tUm93SWR4ID0gYm90dG9tUm93SWR4ICsgMjtcbiAgICAgICAgfVxuICAgICAgICB0b3BSb3dJZHggPSB0b3BSb3dJZHggKyBpbldpZHRoO1xuICAgICAgICBib3R0b21Sb3dJZHggPSBib3R0b21Sb3dJZHggKyBpbldpZHRoO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBoc3YycmdiKGhzdiwgcmdiKSB7XG4gICAgdmFyIGggPSBoc3ZbMF0sXG4gICAgICAgIHMgPSBoc3ZbMV0sXG4gICAgICAgIHYgPSBoc3ZbMl0sXG4gICAgICAgIGMgPSB2ICogcyxcbiAgICAgICAgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChoIC8gNjApICUgMiAtIDEpKSxcbiAgICAgICAgbSA9IHYgLSBjLFxuICAgICAgICByID0gMCxcbiAgICAgICAgZyA9IDAsXG4gICAgICAgIGIgPSAwO1xuXG4gICAgcmdiID0gcmdiIHx8IFswLCAwLCAwXTtcblxuICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgciA9IGM7XG4gICAgICAgIGcgPSB4O1xuICAgIH0gZWxzZSBpZiAoaCA8IDEyMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgZyA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMTgwKSB7XG4gICAgICAgIGcgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9IGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgZyA9IHg7XG4gICAgICAgIGIgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDMwMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgYiA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMzYwKSB7XG4gICAgICAgIHIgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9XG4gICAgcmdiWzBdID0gKChyICsgbSkgKiAyNTUpIHwgMDtcbiAgICByZ2JbMV0gPSAoKGcgKyBtKSAqIDI1NSkgfCAwO1xuICAgIHJnYlsyXSA9ICgoYiArIG0pICogMjU1KSB8IDA7XG4gICAgcmV0dXJuIHJnYjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfY29tcHV0ZURpdmlzb3JzKG4pIHtcbiAgICB2YXIgbGFyZ2VEaXZpc29ycyA9IFtdLFxuICAgICAgICBkaXZpc29ycyA9IFtdLFxuICAgICAgICBpO1xuXG4gICAgZm9yIChpID0gMTsgaSA8IE1hdGguc3FydChuKSArIDE7IGkrKykge1xuICAgICAgICBpZiAobiAlIGkgPT09IDApIHtcbiAgICAgICAgICAgIGRpdmlzb3JzLnB1c2goaSk7XG4gICAgICAgICAgICBpZiAoaSAhPT0gbiAvIGkpIHtcbiAgICAgICAgICAgICAgICBsYXJnZURpdmlzb3JzLnVuc2hpZnQoTWF0aC5mbG9vcihuIC8gaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXZpc29ycy5jb25jYXQobGFyZ2VEaXZpc29ycyk7XG59O1xuXG5mdW5jdGlvbiBfY29tcHV0ZUludGVyc2VjdGlvbihhcnIxLCBhcnIyKSB7XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoaSA8IGFycjEubGVuZ3RoICYmIGogPCBhcnIyLmxlbmd0aCkge1xuICAgICAgICBpZiAoYXJyMVtpXSA9PT0gYXJyMltqXSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyMVtpXSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJyMVtpXSA+IGFycjJbal0pIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVBhdGNoU2l6ZShwYXRjaFNpemUsIGltZ1NpemUpIHtcbiAgICB2YXIgZGl2aXNvcnNYID0gX2NvbXB1dGVEaXZpc29ycyhpbWdTaXplLngpLFxuICAgICAgICBkaXZpc29yc1kgPSBfY29tcHV0ZURpdmlzb3JzKGltZ1NpemUueSksXG4gICAgICAgIHdpZGVTaWRlID0gTWF0aC5tYXgoaW1nU2l6ZS54LCBpbWdTaXplLnkpLFxuICAgICAgICBjb21tb24gPSBfY29tcHV0ZUludGVyc2VjdGlvbihkaXZpc29yc1gsIGRpdmlzb3JzWSksXG4gICAgICAgIG5yT2ZQYXRjaGVzTGlzdCA9IFs4LCAxMCwgMTUsIDIwLCAzMiwgNjAsIDgwXSxcbiAgICAgICAgbnJPZlBhdGNoZXNNYXAgPSB7XG4gICAgICAgICAgICBcIngtc21hbGxcIjogNSxcbiAgICAgICAgICAgIFwic21hbGxcIjogNCxcbiAgICAgICAgICAgIFwibWVkaXVtXCI6IDMsXG4gICAgICAgICAgICBcImxhcmdlXCI6IDIsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMVxuICAgICAgICB9LFxuICAgICAgICBuck9mUGF0Y2hlc0lkeCA9IG5yT2ZQYXRjaGVzTWFwW3BhdGNoU2l6ZV0gfHwgbnJPZlBhdGNoZXNNYXAubWVkaXVtLFxuICAgICAgICBuck9mUGF0Y2hlcyA9IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeF0sXG4gICAgICAgIGRlc2lyZWRQYXRjaFNpemUgPSBNYXRoLmZsb29yKHdpZGVTaWRlIC8gbnJPZlBhdGNoZXMpLFxuICAgICAgICBvcHRpbWFsUGF0Y2hTaXplO1xuXG4gICAgZnVuY3Rpb24gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKGRpdmlzb3JzKSB7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgIGZvdW5kID0gZGl2aXNvcnNbTWF0aC5mbG9vcihkaXZpc29ycy5sZW5ndGggLyAyKV07XG5cbiAgICAgICAgd2hpbGUgKGkgPCAoZGl2aXNvcnMubGVuZ3RoIC0gMSkgJiYgZGl2aXNvcnNbaV0gPCBkZXNpcmVkUGF0Y2hTaXplKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZGl2aXNvcnNbaV0gLSBkZXNpcmVkUGF0Y2hTaXplKSA+IE1hdGguYWJzKGRpdmlzb3JzW2kgLSAxXSAtIGRlc2lyZWRQYXRjaFNpemUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBkaXZpc29yc1tpIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZGl2aXNvcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2lyZWRQYXRjaFNpemUgLyBmb3VuZCA8IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeCArIDFdIC8gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4XSAmJlxuICAgICAgICAgICAgZGVzaXJlZFBhdGNoU2l6ZSAvIGZvdW5kID4gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4IC0gMV0gLyBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHhdICkge1xuICAgICAgICAgICAgcmV0dXJuIHt4OiBmb3VuZCwgeTogZm91bmR9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIG9wdGltYWxQYXRjaFNpemUgPSBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoY29tbW9uKTtcbiAgICBpZiAoIW9wdGltYWxQYXRjaFNpemUpIHtcbiAgICAgICAgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhfY29tcHV0ZURpdmlzb3JzKHdpZGVTaWRlKSk7XG4gICAgICAgIGlmICghb3B0aW1hbFBhdGNoU2l6ZSkge1xuICAgICAgICAgICAgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycygoX2NvbXB1dGVEaXZpc29ycyhkZXNpcmVkUGF0Y2hTaXplICogbnJPZlBhdGNoZXMpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wdGltYWxQYXRjaFNpemU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzKHZhbHVlKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHtcbiAgICAgICAgdmFsdWU6IHBhcnNlRmxvYXQodmFsdWUpLFxuICAgICAgICB1bml0OiB2YWx1ZS5pbmRleE9mKFwiJVwiKSA9PT0gdmFsdWUubGVuZ3RoIC0gMSA/IFwiJVwiIDogXCIlXCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBfZGltZW5zaW9uc0NvbnZlcnRlcnMgPSB7XG4gICAgdG9wOiBmdW5jdGlvbihkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGRpbWVuc2lvbi51bml0ID09PSBcIiVcIikge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY29udGV4dC5oZWlnaHQgKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJpZ2h0OiBmdW5jdGlvbihkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGRpbWVuc2lvbi51bml0ID09PSBcIiVcIikge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY29udGV4dC53aWR0aCAtIChjb250ZXh0LndpZHRoICogKGRpbWVuc2lvbi52YWx1ZSAvIDEwMCkpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYm90dG9tOiBmdW5jdGlvbihkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGRpbWVuc2lvbi51bml0ID09PSBcIiVcIikge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY29udGV4dC5oZWlnaHQgLSAoY29udGV4dC5oZWlnaHQgKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBsZWZ0OiBmdW5jdGlvbihkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGRpbWVuc2lvbi51bml0ID09PSBcIiVcIikge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY29udGV4dC53aWR0aCAqIChkaW1lbnNpb24udmFsdWUgLyAxMDApKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSW1hZ2VBcmVhKGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBhcmVhKSB7XG4gICAgdmFyIGNvbnRleHQgPSB7d2lkdGg6IGlucHV0V2lkdGgsIGhlaWdodDogaW5wdXRIZWlnaHR9O1xuXG4gICAgdmFyIHBhcnNlZEFyZWEgPSBPYmplY3Qua2V5cyhhcmVhKS5yZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJlYVtrZXldLFxuICAgICAgICAgICAgcGFyc2VkID0gX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzKHZhbHVlKSxcbiAgICAgICAgICAgIGNhbGN1bGF0ZWQgPSBfZGltZW5zaW9uc0NvbnZlcnRlcnNba2V5XShwYXJzZWQsIGNvbnRleHQpO1xuXG4gICAgICAgIHJlc3VsdFtrZXldID0gY2FsY3VsYXRlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzeDogcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzeTogcGFyc2VkQXJlYS50b3AsXG4gICAgICAgIHN3OiBwYXJzZWRBcmVhLnJpZ2h0IC0gcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzaDogcGFyc2VkQXJlYS5ib3R0b20gLSBwYXJzZWRBcmVhLnRvcFxuICAgIH07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9jdl91dGlscy5qcyIsImltcG9ydCBTdWJJbWFnZSBmcm9tICcuL3N1YkltYWdlJztcbmltcG9ydCB7aHN2MnJnYn0gZnJvbSAnLi4vY29tbW9uL2N2X3V0aWxzJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcbmNvbnN0IHZlYzIgPSB7XG4gICAgY2xvbmU6IHJlcXVpcmUoJ2dsLXZlYzIvY2xvbmUnKSxcbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhc2ljIGltYWdlIGNvbWJpbmluZyB0aGUgZGF0YSBhbmQgc2l6ZS5cbiAqIEluIGFkZGl0aW9uLCBzb21lIG1ldGhvZHMgZm9yIG1hbmlwdWxhdGlvbiBhcmUgY29udGFpbmVkLlxuICogQHBhcmFtIHNpemUge3gseX0gVGhlIHNpemUgb2YgdGhlIGltYWdlIGluIHBpeGVsXG4gKiBAcGFyYW0gZGF0YSB7QXJyYXl9IElmIGdpdmVuLCBhIGZsYXQgYXJyYXkgY29udGFpbmluZyB0aGUgcGl4ZWwgZGF0YVxuICogQHBhcmFtIEFycmF5VHlwZSB7VHlwZX0gSWYgZ2l2ZW4sIHRoZSBkZXNpcmVkIERhdGFUeXBlIG9mIHRoZSBBcnJheSAobWF5IGJlIHR5cGVkL25vbi10eXBlZClcbiAqIEBwYXJhbSBpbml0aWFsaXplIHtCb29sZWFufSBJbmRpY2F0aW5nIGlmIHRoZSBhcnJheSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb24gY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7SW1hZ2VXcmFwcGVyfVxuICovXG5mdW5jdGlvbiBJbWFnZVdyYXBwZXIoc2l6ZSwgZGF0YSwgQXJyYXlUeXBlLCBpbml0aWFsaXplKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGlmIChBcnJheVR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBBcnJheVR5cGUoc2l6ZS54ICogc2l6ZS55KTtcbiAgICAgICAgICAgIGlmIChBcnJheVR5cGUgPT09IEFycmF5ICYmIGluaXRpYWxpemUpIHtcbiAgICAgICAgICAgICAgICBBcnJheUhlbHBlci5pbml0KHRoaXMuZGF0YSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShzaXplLnggKiBzaXplLnkpO1xuICAgICAgICAgICAgaWYgKFVpbnQ4QXJyYXkgPT09IEFycmF5ICYmIGluaXRpYWxpemUpIHtcbiAgICAgICAgICAgICAgICBBcnJheUhlbHBlci5pbml0KHRoaXMuZGF0YSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgICB0aGlzLnNpemUgPSBzaXplO1xufVxuXG4vKipcbiAqIHRlc3RzIGlmIGEgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBpbWFnZSB3aXRoIGEgZ2l2ZW4gb2Zmc2V0XG4gKiBAcGFyYW0gaW1nUmVmIHt4LCB5fSBUaGUgbG9jYXRpb24gdG8gdGVzdFxuICogQHBhcmFtIGJvcmRlciBOdW1iZXIgdGhlIHBhZGRpbmcgdmFsdWUgaW4gcGl4ZWxcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGxvY2F0aW9uIGluc2lkZSB0aGUgaW1hZ2UncyBib3JkZXIsIGZhbHNlIG90aGVyd2lzZVxuICogQHNlZSBjdmQvaW1hZ2UuaFxuICovXG5JbWFnZVdyYXBwZXIucHJvdG90eXBlLmluSW1hZ2VXaXRoQm9yZGVyID0gZnVuY3Rpb24oaW1nUmVmLCBib3JkZXIpIHtcbiAgICByZXR1cm4gKGltZ1JlZi54ID49IGJvcmRlcilcbiAgICAgICAgJiYgKGltZ1JlZi55ID49IGJvcmRlcilcbiAgICAgICAgJiYgKGltZ1JlZi54IDwgKHRoaXMuc2l6ZS54IC0gYm9yZGVyKSlcbiAgICAgICAgJiYgKGltZ1JlZi55IDwgKHRoaXMuc2l6ZS55IC0gYm9yZGVyKSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGJpbGluZWFyIHNhbXBsaW5nXG4gKiBAcGFyYW0gaW5JbWcgSW1hZ2UgdG8gZXh0cmFjdCBzYW1wbGUgZnJvbVxuICogQHBhcmFtIHggdGhlIHgtY29vcmRpbmF0ZVxuICogQHBhcmFtIHkgdGhlIHktY29vcmRpbmF0ZVxuICogQHJldHVybnMgdGhlIHNhbXBsZWQgdmFsdWVcbiAqIEBzZWUgY3ZkL3Zpc2lvbi5oXG4gKi9cbkltYWdlV3JhcHBlci5zYW1wbGUgPSBmdW5jdGlvbihpbkltZywgeCwgeSkge1xuICAgIHZhciBseCA9IE1hdGguZmxvb3IoeCk7XG4gICAgdmFyIGx5ID0gTWF0aC5mbG9vcih5KTtcbiAgICB2YXIgdyA9IGluSW1nLnNpemUueDtcbiAgICB2YXIgYmFzZSA9IGx5ICogaW5JbWcuc2l6ZS54ICsgbHg7XG4gICAgdmFyIGEgPSBpbkltZy5kYXRhW2Jhc2UgKyAwXTtcbiAgICB2YXIgYiA9IGluSW1nLmRhdGFbYmFzZSArIDFdO1xuICAgIHZhciBjID0gaW5JbWcuZGF0YVtiYXNlICsgd107XG4gICAgdmFyIGQgPSBpbkltZy5kYXRhW2Jhc2UgKyB3ICsgMV07XG4gICAgdmFyIGUgPSBhIC0gYjtcbiAgICB4IC09IGx4O1xuICAgIHkgLT0gbHk7XG5cbiAgICB2YXIgcmVzdWx0ID0gTWF0aC5mbG9vcih4ICogKHkgKiAoZSAtIGMgKyBkKSAtIGUpICsgeSAqIChjIC0gYSkgKyBhKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIGdpdmVuIGFycmF5LiBTZXRzIGVhY2ggZWxlbWVudCB0byB6ZXJvLlxuICogQHBhcmFtIGFycmF5IHtBcnJheX0gVGhlIGFycmF5IHRvIGluaXRpYWxpemVcbiAqL1xuSW1hZ2VXcmFwcGVyLmNsZWFyQXJyYXkgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgYXJyYXlbbF0gPSAwO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtTdWJJbWFnZX0gZnJvbSB0aGUgY3VycmVudCBpbWFnZSAoe3RoaXN9KS5cbiAqIEBwYXJhbSBmcm9tIHtJbWFnZVJlZn0gVGhlIHBvc2l0aW9uIHdoZXJlIHRvIHN0YXJ0IHRoZSB7U3ViSW1hZ2V9IGZyb20uICh0b3AtbGVmdCBjb3JuZXIpXG4gKiBAcGFyYW0gc2l6ZSB7SW1hZ2VSZWZ9IFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgaW1hZ2VcbiAqIEByZXR1cm5zIHtTdWJJbWFnZX0gQSBzaGFyZWQgcGFydCBvZiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqL1xuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5zdWJJbWFnZSA9IGZ1bmN0aW9uKGZyb20sIHNpemUpIHtcbiAgICByZXR1cm4gbmV3IFN1YkltYWdlKGZyb20sIHNpemUsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIHtJbWFnZVdyYXBwZXIpIGFuZCBjb3BpZXMgdGhlIG5lZWRlZCB1bmRlcmx5aW5nIGltYWdlLWRhdGEgYXJlYVxuICogQHBhcmFtIGltYWdlV3JhcHBlciB7SW1hZ2VXcmFwcGVyfSBUaGUgdGFyZ2V0IHtJbWFnZVdyYXBwZXJ9IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSBjb3BpZWRcbiAqIEBwYXJhbSBmcm9tIHtJbWFnZVJlZn0gVGhlIGxvY2F0aW9uIHdoZXJlIHRvIGNvcHkgZnJvbSAodG9wLWxlZnQgbG9jYXRpb24pXG4gKi9cbkltYWdlV3JhcHBlci5wcm90b3R5cGUuc3ViSW1hZ2VBc0NvcHkgPSBmdW5jdGlvbihpbWFnZVdyYXBwZXIsIGZyb20pIHtcbiAgICB2YXIgc2l6ZVkgPSBpbWFnZVdyYXBwZXIuc2l6ZS55LCBzaXplWCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgdmFyIHgsIHk7XG4gICAgZm9yICggeCA9IDA7IHggPCBzaXplWDsgeCsrKSB7XG4gICAgICAgIGZvciAoIHkgPSAwOyB5IDwgc2l6ZVk7IHkrKykge1xuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGFbeSAqIHNpemVYICsgeF0gPSB0aGlzLmRhdGFbKGZyb20ueSArIHkpICogdGhpcy5zaXplLnggKyBmcm9tLnggKyB4XTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkltYWdlV3JhcHBlci5wcm90b3R5cGUuY29weVRvID0gZnVuY3Rpb24oaW1hZ2VXcmFwcGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGgsIHNyY0RhdGEgPSB0aGlzLmRhdGEsIGRzdERhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBkc3REYXRhW2xlbmd0aF0gPSBzcmNEYXRhW2xlbmd0aF07XG4gICAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBnaXZlbiBwaXhlbCBwb3NpdGlvbiBmcm9tIHRoZSBpbWFnZVxuICogQHBhcmFtIHgge051bWJlcn0gVGhlIHgtcG9zaXRpb25cbiAqIEBwYXJhbSB5IHtOdW1iZXJ9IFRoZSB5LXBvc2l0aW9uXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgZ3JheXNjYWxlIHZhbHVlIGF0IHRoZSBwaXhlbC1wb3NpdGlvblxuICovXG5JbWFnZVdyYXBwZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhW3kgKiB0aGlzLnNpemUueCArIHhdO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBnaXZlbiBwaXhlbCBwb3NpdGlvbiBmcm9tIHRoZSBpbWFnZVxuICogQHBhcmFtIHgge051bWJlcn0gVGhlIHgtcG9zaXRpb25cbiAqIEBwYXJhbSB5IHtOdW1iZXJ9IFRoZSB5LXBvc2l0aW9uXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgZ3JheXNjYWxlIHZhbHVlIGF0IHRoZSBwaXhlbC1wb3NpdGlvblxuICovXG5JbWFnZVdyYXBwZXIucHJvdG90eXBlLmdldFNhZmUgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoIXRoaXMuaW5kZXhNYXBwaW5nKSB7XG4gICAgICAgIHRoaXMuaW5kZXhNYXBwaW5nID0ge1xuICAgICAgICAgICAgeDogW10sXG4gICAgICAgICAgICB5OiBbXVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zaXplLng7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueFtpXSA9IGk7XG4gICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy54W2kgKyB0aGlzLnNpemUueF0gPSBpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNpemUueTsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy55W2ldID0gaTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhNYXBwaW5nLnlbaSArIHRoaXMuc2l6ZS55XSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YVsodGhpcy5pbmRleE1hcHBpbmcueVt5ICsgdGhpcy5zaXplLnldKSAqIHRoaXMuc2l6ZS54ICsgdGhpcy5pbmRleE1hcHBpbmcueFt4ICsgdGhpcy5zaXplLnhdXTtcbn07XG5cbi8qKlxuICogU2V0cyBhIGdpdmVuIHBpeGVsIHBvc2l0aW9uIGluIHRoZSBpbWFnZVxuICogQHBhcmFtIHgge051bWJlcn0gVGhlIHgtcG9zaXRpb25cbiAqIEBwYXJhbSB5IHtOdW1iZXJ9IFRoZSB5LXBvc2l0aW9uXG4gKiBAcGFyYW0gdmFsdWUge051bWJlcn0gVGhlIGdyYXlzY2FsZSB2YWx1ZSB0byBzZXRcbiAqIEByZXR1cm5zIHtJbWFnZVdyYXBwZXJ9IFRoZSBJbWFnZSBpdHNlbGYgKGZvciBwb3NzaWJsZSBjaGFpbmluZylcbiAqL1xuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbih4LCB5LCB2YWx1ZSkge1xuICAgIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBib3JkZXIgb2YgdGhlIGltYWdlICgxIHBpeGVsKSB0byB6ZXJvXG4gKi9cbkltYWdlV3JhcHBlci5wcm90b3R5cGUuemVyb0JvcmRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpLCB3aWR0aCA9IHRoaXMuc2l6ZS54LCBoZWlnaHQgPSB0aGlzLnNpemUueSwgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBmb3IgKCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IGRhdGFbKGhlaWdodCAtIDEpICogd2lkdGggKyBpXSA9IDA7XG4gICAgfVxuICAgIGZvciAoIGkgPSAxOyBpIDwgaGVpZ2h0IC0gMTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaSAqIHdpZHRoXSA9IGRhdGFbaSAqIHdpZHRoICsgKHdpZHRoIC0gMSldID0gMDtcbiAgICB9XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBiaW5hcnkgaW1hZ2UgaW4gcGxhY2VcbiAqL1xuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgZGF0YVtsZW5ndGhdID0gZGF0YVtsZW5ndGhdID8gMCA6IDE7XG4gICAgfVxufTtcblxuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5jb252b2x2ZSA9IGZ1bmN0aW9uKGtlcm5lbCkge1xuICAgIHZhciB4LCB5LCBreCwga3ksIGtTaXplID0gKGtlcm5lbC5sZW5ndGggLyAyKSB8IDAsIGFjY3UgPSAwO1xuICAgIGZvciAoIHkgPSAwOyB5IDwgdGhpcy5zaXplLnk7IHkrKykge1xuICAgICAgICBmb3IgKCB4ID0gMDsgeCA8IHRoaXMuc2l6ZS54OyB4KyspIHtcbiAgICAgICAgICAgIGFjY3UgPSAwO1xuICAgICAgICAgICAgZm9yICgga3kgPSAta1NpemU7IGt5IDw9IGtTaXplOyBreSsrKSB7XG4gICAgICAgICAgICAgICAgZm9yICgga3ggPSAta1NpemU7IGt4IDw9IGtTaXplOyBreCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3UgKz0ga2VybmVsW2t5ICsga1NpemVdW2t4ICsga1NpemVdICogdGhpcy5nZXRTYWZlKHggKyBreCwgeSArIGt5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGFbeSAqIHRoaXMuc2l6ZS54ICsgeF0gPSBhY2N1O1xuICAgICAgICB9XG4gICAgfVxufTtcblxuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5tb21lbnRzID0gZnVuY3Rpb24obGFiZWxjb3VudCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5kYXRhLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBoZWlnaHQgPSB0aGlzLnNpemUueSxcbiAgICAgICAgd2lkdGggPSB0aGlzLnNpemUueCxcbiAgICAgICAgdmFsLFxuICAgICAgICB5c3EsXG4gICAgICAgIGxhYmVsc3VtID0gW10sXG4gICAgICAgIGksXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBtdTExLFxuICAgICAgICBtdTAyLFxuICAgICAgICBtdTIwLFxuICAgICAgICB4XyxcbiAgICAgICAgeV8sXG4gICAgICAgIHRtcCxcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIFBJID0gTWF0aC5QSSxcbiAgICAgICAgUElfNCA9IFBJIC8gNDtcblxuICAgIGlmIChsYWJlbGNvdW50IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IGxhYmVsY291bnQ7IGkrKykge1xuICAgICAgICBsYWJlbHN1bVtpXSA9IHtcbiAgICAgICAgICAgIG0wMDogMCxcbiAgICAgICAgICAgIG0wMTogMCxcbiAgICAgICAgICAgIG0xMDogMCxcbiAgICAgICAgICAgIG0xMTogMCxcbiAgICAgICAgICAgIG0wMjogMCxcbiAgICAgICAgICAgIG0yMDogMCxcbiAgICAgICAgICAgIHRoZXRhOiAwLFxuICAgICAgICAgICAgcmFkOiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICB5c3EgPSB5ICogeTtcbiAgICAgICAgZm9yICggeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICB2YWwgPSBkYXRhW3kgKiB3aWR0aCArIHhdO1xuICAgICAgICAgICAgaWYgKHZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsc3VtW3ZhbCAtIDFdO1xuICAgICAgICAgICAgICAgIGxhYmVsLm0wMCArPSAxO1xuICAgICAgICAgICAgICAgIGxhYmVsLm0wMSArPSB5O1xuICAgICAgICAgICAgICAgIGxhYmVsLm0xMCArPSB4O1xuICAgICAgICAgICAgICAgIGxhYmVsLm0xMSArPSB4ICogeTtcbiAgICAgICAgICAgICAgICBsYWJlbC5tMDIgKz0geXNxO1xuICAgICAgICAgICAgICAgIGxhYmVsLm0yMCArPSB4ICogeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoIGkgPSAwOyBpIDwgbGFiZWxjb3VudDsgaSsrKSB7XG4gICAgICAgIGxhYmVsID0gbGFiZWxzdW1baV07XG4gICAgICAgIGlmICghaXNOYU4obGFiZWwubTAwKSAmJiBsYWJlbC5tMDAgIT09IDApIHtcbiAgICAgICAgICAgIHhfID0gbGFiZWwubTEwIC8gbGFiZWwubTAwO1xuICAgICAgICAgICAgeV8gPSBsYWJlbC5tMDEgLyBsYWJlbC5tMDA7XG4gICAgICAgICAgICBtdTExID0gbGFiZWwubTExIC8gbGFiZWwubTAwIC0geF8gKiB5XztcbiAgICAgICAgICAgIG11MDIgPSBsYWJlbC5tMDIgLyBsYWJlbC5tMDAgLSB5XyAqIHlfO1xuICAgICAgICAgICAgbXUyMCA9IGxhYmVsLm0yMCAvIGxhYmVsLm0wMCAtIHhfICogeF87XG4gICAgICAgICAgICB0bXAgPSAobXUwMiAtIG11MjApIC8gKDIgKiBtdTExKTtcbiAgICAgICAgICAgIHRtcCA9IDAuNSAqIE1hdGguYXRhbih0bXApICsgKG11MTEgPj0gMCA/IFBJXzQgOiAtUElfNCApICsgUEk7XG4gICAgICAgICAgICBsYWJlbC50aGV0YSA9ICh0bXAgKiAxODAgLyBQSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgICAgICAgICAgaWYgKGxhYmVsLnRoZXRhIDwgMCkge1xuICAgICAgICAgICAgICAgIGxhYmVsLnRoZXRhICs9IDE4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhYmVsLnJhZCA9IHRtcCA+IFBJID8gdG1wIC0gUEkgOiB0bXA7XG4gICAgICAgICAgICBsYWJlbC52ZWMgPSB2ZWMyLmNsb25lKFtNYXRoLmNvcyh0bXApLCBNYXRoLnNpbih0bXApXSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChsYWJlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBEaXNwbGF5cyB0aGUge0ltYWdlV3JhcHBlcn0gaW4gYSBnaXZlbiBjYW52YXNcbiAqIEBwYXJhbSBjYW52YXMge0NhbnZhc30gVGhlIGNhbnZhcyBlbGVtZW50IHRvIHdyaXRlIHRvXG4gKiBAcGFyYW0gc2NhbGUge051bWJlcn0gU2NhbGUgd2hpY2ggaXMgYXBwbGllZCB0byBlYWNoIHBpeGVsLXZhbHVlXG4gKi9cbkltYWdlV3JhcHBlci5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGNhbnZhcywgc2NhbGUpIHtcbiAgICB2YXIgY3R4LFxuICAgICAgICBmcmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgcGl4ZWwsXG4gICAgICAgIHgsXG4gICAgICAgIHk7XG5cbiAgICBpZiAoIXNjYWxlKSB7XG4gICAgICAgIHNjYWxlID0gMS4wO1xuICAgIH1cbiAgICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjYW52YXMud2lkdGggPSB0aGlzLnNpemUueDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgZnJhbWUgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgZGF0YSA9IGZyYW1lLmRhdGE7XG4gICAgY3VycmVudCA9IDA7XG4gICAgZm9yICh5ID0gMDsgeSA8IHRoaXMuc2l6ZS55OyB5KyspIHtcbiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHRoaXMuc2l6ZS54OyB4KyspIHtcbiAgICAgICAgICAgIHBpeGVsID0geSAqIHRoaXMuc2l6ZS54ICsgeDtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmdldCh4LCB5KSAqIHNjYWxlO1xuICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAwXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBkYXRhW3BpeGVsICogNCArIDFdID0gY3VycmVudDtcbiAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgMl0gPSBjdXJyZW50O1xuICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2ZyYW1lLmRhdGEgPSBkYXRhO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoZnJhbWUsIDAsIDApO1xufTtcblxuLyoqXG4gKiBEaXNwbGF5cyB0aGUge1N1YkltYWdlfSBpbiBhIGdpdmVuIGNhbnZhc1xuICogQHBhcmFtIGNhbnZhcyB7Q2FudmFzfSBUaGUgY2FudmFzIGVsZW1lbnQgdG8gd3JpdGUgdG9cbiAqIEBwYXJhbSBzY2FsZSB7TnVtYmVyfSBTY2FsZSB3aGljaCBpcyBhcHBsaWVkIHRvIGVhY2ggcGl4ZWwtdmFsdWVcbiAqL1xuSW1hZ2VXcmFwcGVyLnByb3RvdHlwZS5vdmVybGF5ID0gZnVuY3Rpb24oY2FudmFzLCBzY2FsZSwgZnJvbSkge1xuICAgIGlmICghc2NhbGUgfHwgc2NhbGUgPCAwIHx8IHNjYWxlID4gMzYwKSB7XG4gICAgICAgIHNjYWxlID0gMzYwO1xuICAgIH1cbiAgICB2YXIgaHN2ID0gWzAsIDEsIDFdO1xuICAgIHZhciByZ2IgPSBbMCwgMCwgMF07XG4gICAgdmFyIHdoaXRlUmdiID0gWzI1NSwgMjU1LCAyNTVdO1xuICAgIHZhciBibGFja1JnYiA9IFswLCAwLCAwXTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBmcmFtZSA9IGN0eC5nZXRJbWFnZURhdGEoZnJvbS54LCBmcm9tLnksIHRoaXMuc2l6ZS54LCB0aGlzLnNpemUueSk7XG4gICAgdmFyIGRhdGEgPSBmcmFtZS5kYXRhO1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBoc3ZbMF0gPSB0aGlzLmRhdGFbbGVuZ3RoXSAqIHNjYWxlO1xuICAgICAgICByZXN1bHQgPSBoc3ZbMF0gPD0gMCA/IHdoaXRlUmdiIDogaHN2WzBdID49IDM2MCA/IGJsYWNrUmdiIDogaHN2MnJnYihoc3YsIHJnYik7XG4gICAgICAgIGRhdGFbbGVuZ3RoICogNCArIDBdID0gcmVzdWx0WzBdO1xuICAgICAgICBkYXRhW2xlbmd0aCAqIDQgKyAxXSA9IHJlc3VsdFsxXTtcbiAgICAgICAgZGF0YVtsZW5ndGggKiA0ICsgMl0gPSByZXN1bHRbMl07XG4gICAgICAgIGRhdGFbbGVuZ3RoICogNCArIDNdID0gMjU1O1xuICAgIH1cbiAgICBjdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCBmcm9tLngsIGZyb20ueSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbWFnZVdyYXBwZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tbW9uL2ltYWdlX3dyYXBwZXIuanMiLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXROYXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL190b0tleS5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQXJyYXlMaWtlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc0Z1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzTGVuZ3RoLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzU3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZU1lcmdlID0gcmVxdWlyZSgnLi9fYmFzZU1lcmdlJyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAqIH07XG4gKlxuICogdmFyIG90aGVyID0ge1xuICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICogfTtcbiAqXG4gKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICovXG52YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvbWVyZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdGlmKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9UaXBzLzQwNzE3Mi9Db25uZWN0ZWQtQ29tcG9uZW50LUxhYmVsaW5nLWFuZC1WZWN0b3JpemF0aW9uXG4gKi9cbnZhciBUcmFjZXIgPSB7XG4gICAgc2VhcmNoRGlyZWN0aW9uczogW1swLCAxXSwgWzEsIDFdLCBbMSwgMF0sIFsxLCAtMV0sIFswLCAtMV0sIFstMSwgLTFdLCBbLTEsIDBdLCBbLTEsIDFdXSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKSB7XG4gICAgICAgIHZhciBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgICAgIGxhYmVsRGF0YSA9IGxhYmVsV3JhcHBlci5kYXRhLFxuICAgICAgICAgICAgc2VhcmNoRGlyZWN0aW9ucyA9IHRoaXMuc2VhcmNoRGlyZWN0aW9ucyxcbiAgICAgICAgICAgIHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueCxcbiAgICAgICAgICAgIHBvcztcblxuICAgICAgICBmdW5jdGlvbiB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICB4O1xuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgICAgIHkgPSBjdXJyZW50LmN5ICsgc2VhcmNoRGlyZWN0aW9uc1tjdXJyZW50LmRpcl1bMF07XG4gICAgICAgICAgICAgICAgeCA9IGN1cnJlbnQuY3ggKyBzZWFyY2hEaXJlY3Rpb25zW2N1cnJlbnQuZGlyXVsxXTtcbiAgICAgICAgICAgICAgICBwb3MgPSB5ICogd2lkdGggKyB4O1xuICAgICAgICAgICAgICAgIGlmICgoaW1hZ2VEYXRhW3Bvc10gPT09IGNvbG9yKSAmJiAoKGxhYmVsRGF0YVtwb3NdID09PSAwKSB8fCAobGFiZWxEYXRhW3Bvc10gPT09IGxhYmVsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxEYXRhW3Bvc10gPSBsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5jeSA9IHk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuY3ggPSB4O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxEYXRhW3Bvc10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsRGF0YVtwb3NdID0gZWRnZWxhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZGlyID0gKGN1cnJlbnQuZGlyICsgMSkgJSA4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHZlcnRleDJEKHgsIHksIGRpcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkaXI6IGRpcixcbiAgICAgICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICBwcmV2OiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY29udG91clRyYWNpbmcoc3ksIHN4LCBsYWJlbCwgY29sb3IsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgdmFyIEZ2ID0gbnVsbCxcbiAgICAgICAgICAgICAgICBDdixcbiAgICAgICAgICAgICAgICBQLFxuICAgICAgICAgICAgICAgIGxkaXIsXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgY3g6IHN4LFxuICAgICAgICAgICAgICAgICAgICBjeTogc3ksXG4gICAgICAgICAgICAgICAgICAgIGRpcjogMFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCkpIHtcbiAgICAgICAgICAgICAgICBGdiA9IHZlcnRleDJEKHN4LCBzeSwgY3VycmVudC5kaXIpO1xuICAgICAgICAgICAgICAgIEN2ID0gRnY7XG4gICAgICAgICAgICAgICAgbGRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgICAgIFAgPSB2ZXJ0ZXgyRChjdXJyZW50LmN4LCBjdXJyZW50LmN5LCAwKTtcbiAgICAgICAgICAgICAgICBQLnByZXYgPSBDdjtcbiAgICAgICAgICAgICAgICBDdi5uZXh0ID0gUDtcbiAgICAgICAgICAgICAgICBQLm5leHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIEN2ID0gUDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZGlyID0gKGN1cnJlbnQuZGlyICsgNikgJSA4O1xuICAgICAgICAgICAgICAgICAgICB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZGlyICE9PSBjdXJyZW50LmRpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YuZGlyID0gY3VycmVudC5kaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBQID0gdmVydGV4MkQoY3VycmVudC5jeCwgY3VycmVudC5jeSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBQLnByZXYgPSBDdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2Lm5leHQgPSBQO1xuICAgICAgICAgICAgICAgICAgICAgICAgUC5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2ID0gUDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LmRpciA9IGxkaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi54ID0gY3VycmVudC5jeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LnkgPSBjdXJyZW50LmN5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxkaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyZW50LmN4ICE9PSBzeCB8fCBjdXJyZW50LmN5ICE9PSBzeSk7XG4gICAgICAgICAgICAgICAgRnYucHJldiA9IEN2LnByZXY7XG4gICAgICAgICAgICAgICAgQ3YucHJldi5uZXh0ID0gRnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRnY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2U6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250b3VyVHJhY2luZzogZnVuY3Rpb24oc3ksIHN4LCBsYWJlbCwgY29sb3IsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250b3VyVHJhY2luZyhzeSwgc3gsIGxhYmVsLCBjb2xvciwgZWRnZWxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoVHJhY2VyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhdG9yL3RyYWNlci5qcyIsImltcG9ydCBCYXJjb2RlUmVhZGVyIGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4uL2NvbW1vbi9hcnJheV9oZWxwZXInO1xuXG5mdW5jdGlvbiBDb2RlMzlSZWFkZXIoKSB7XG4gICAgQmFyY29kZVJlYWRlci5jYWxsKHRoaXMpO1xufVxuXG52YXIgcHJvcGVydGllcyA9IHtcbiAgICBBTFBIQUJFVEhfU1RSSU5HOiB7dmFsdWU6IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gKiQvKyVcIn0sXG4gICAgQUxQSEFCRVQ6IHt2YWx1ZTogWzQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsXG4gICAgICAgIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDQ1LCA0NiwgMzIsIDQyLCAzNiwgNDcsIDQzLCAzN119LFxuICAgIENIQVJBQ1RFUl9FTkNPRElOR1M6IHt2YWx1ZTogWzB4MDM0LCAweDEyMSwgMHgwNjEsIDB4MTYwLCAweDAzMSwgMHgxMzAsIDB4MDcwLCAweDAyNSwgMHgxMjQsIDB4MDY0LCAweDEwOSwgMHgwNDksXG4gICAgICAgIDB4MTQ4LCAweDAxOSwgMHgxMTgsIDB4MDU4LCAweDAwRCwgMHgxMEMsIDB4MDRDLCAweDAxQywgMHgxMDMsIDB4MDQzLCAweDE0MiwgMHgwMTMsIDB4MTEyLCAweDA1MiwgMHgwMDcsIDB4MTA2LFxuICAgICAgICAweDA0NiwgMHgwMTYsIDB4MTgxLCAweDBDMSwgMHgxQzAsIDB4MDkxLCAweDE5MCwgMHgwRDAsIDB4MDg1LCAweDE4NCwgMHgwQzQsIDB4MDk0LCAweDBBOCwgMHgwQTIsIDB4MDhBLCAweDAyQVxuICAgIF19LFxuICAgIEFTVEVSSVNLOiB7dmFsdWU6IDB4MDk0fSxcbiAgICBGT1JNQVQ6IHt2YWx1ZTogXCJjb2RlXzM5XCIsIHdyaXRlYWJsZTogZmFsc2V9XG59O1xuXG5Db2RlMzlSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCYXJjb2RlUmVhZGVyLnByb3RvdHlwZSwgcHJvcGVydGllcyk7XG5Db2RlMzlSZWFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29kZTM5UmVhZGVyO1xuXG5Db2RlMzlSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGNvdW50ZXJzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgc3RhcnQgPSBzZWxmLl9maW5kU3RhcnQoKSxcbiAgICAgICAgZGVjb2RlZENoYXIsXG4gICAgICAgIGxhc3RTdGFydCxcbiAgICAgICAgcGF0dGVybixcbiAgICAgICAgbmV4dFN0YXJ0O1xuXG4gICAgaWYgKCFzdGFydCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbmV4dFN0YXJ0ID0gc2VsZi5fbmV4dFNldChzZWxmLl9yb3csIHN0YXJ0LmVuZCk7XG5cbiAgICBkbyB7XG4gICAgICAgIGNvdW50ZXJzID0gc2VsZi5fdG9Db3VudGVycyhuZXh0U3RhcnQsIGNvdW50ZXJzKTtcbiAgICAgICAgcGF0dGVybiA9IHNlbGYuX3RvUGF0dGVybihjb3VudGVycyk7XG4gICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENoYXIgPSBzZWxmLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICBpZiAoZGVjb2RlZENoYXIgPCAwKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0O1xuICAgICAgICBuZXh0U3RhcnQgKz0gQXJyYXlIZWxwZXIuc3VtKGNvdW50ZXJzKTtcbiAgICAgICAgbmV4dFN0YXJ0ID0gc2VsZi5fbmV4dFNldChzZWxmLl9yb3csIG5leHRTdGFydCk7XG4gICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgcmVzdWx0LnBvcCgpO1xuXG4gICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghc2VsZi5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGxhc3RTdGFydCwgbmV4dFN0YXJ0LCBjb3VudGVycykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oXCJcIiksXG4gICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgZW5kOiBuZXh0U3RhcnQsXG4gICAgICAgIHN0YXJ0SW5mbzogc3RhcnQsXG4gICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgfTtcbn07XG5cbkNvZGUzOVJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSA9IGZ1bmN0aW9uKGxhc3RTdGFydCwgbmV4dFN0YXJ0LCBjb3VudGVycykge1xuICAgIHZhciB0cmFpbGluZ1doaXRlc3BhY2VFbmQsXG4gICAgICAgIHBhdHRlcm5TaXplID0gQXJyYXlIZWxwZXIuc3VtKGNvdW50ZXJzKTtcblxuICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIHBhdHRlcm5TaXplO1xuICAgIGlmICgodHJhaWxpbmdXaGl0ZXNwYWNlRW5kICogMykgPj0gcGF0dGVyblNpemUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbkNvZGUzOVJlYWRlci5wcm90b3R5cGUuX3BhdHRlcm5Ub0NoYXIgPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgdmFyIGksXG4gICAgICAgIHNlbGYgPSB0aGlzO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNlbGYuQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5DSEFSQUNURVJfRU5DT0RJTkdTW2ldID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzZWxmLkFMUEhBQkVUW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59O1xuXG5Db2RlMzlSZWFkZXIucHJvdG90eXBlLl9maW5kTmV4dFdpZHRoID0gZnVuY3Rpb24oY291bnRlcnMsIGN1cnJlbnQpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjb3VudGVyc1tpXSA8IG1pbldpZHRoICYmIGNvdW50ZXJzW2ldID4gY3VycmVudCkge1xuICAgICAgICAgICAgbWluV2lkdGggPSBjb3VudGVyc1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtaW5XaWR0aDtcbn07XG5cbkNvZGUzOVJlYWRlci5wcm90b3R5cGUuX3RvUGF0dGVybiA9IGZ1bmN0aW9uKGNvdW50ZXJzKSB7XG4gICAgdmFyIG51bUNvdW50ZXJzID0gY291bnRlcnMubGVuZ3RoLFxuICAgICAgICBtYXhOYXJyb3dXaWR0aCA9IDAsXG4gICAgICAgIG51bVdpZGVCYXJzID0gbnVtQ291bnRlcnMsXG4gICAgICAgIHdpZGVCYXJXaWR0aCA9IDAsXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBpO1xuXG4gICAgd2hpbGUgKG51bVdpZGVCYXJzID4gMykge1xuICAgICAgICBtYXhOYXJyb3dXaWR0aCA9IHNlbGYuX2ZpbmROZXh0V2lkdGgoY291bnRlcnMsIG1heE5hcnJvd1dpZHRoKTtcbiAgICAgICAgbnVtV2lkZUJhcnMgPSAwO1xuICAgICAgICBwYXR0ZXJuID0gMDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyc1tpXSA+IG1heE5hcnJvd1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBpKTtcbiAgICAgICAgICAgICAgICBudW1XaWRlQmFycysrO1xuICAgICAgICAgICAgICAgIHdpZGVCYXJXaWR0aCArPSBjb3VudGVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRlQmFycyA9PT0gMykge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvdW50ZXJzICYmIG51bVdpZGVCYXJzID4gMDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldID4gbWF4TmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMtLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjb3VudGVyc1tpXSAqIDIpID49IHdpZGVCYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufTtcblxuQ29kZTM5UmVhZGVyLnByb3RvdHlwZS5fZmluZFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3JvdyksXG4gICAgICAgIHBhdHRlcm5TdGFydCA9IG9mZnNldCxcbiAgICAgICAgY291bnRlciA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgY291bnRlclBvcyA9IDAsXG4gICAgICAgIGlzV2hpdGUgPSBmYWxzZSxcbiAgICAgICAgaSxcbiAgICAgICAgaixcbiAgICAgICAgd2hpdGVTcGFjZU11c3RTdGFydDtcblxuICAgIGZvciAoIGkgPSBvZmZzZXQ7IGkgPCBzZWxmLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHN0YXJ0IHBhdHRlcm5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdG9QYXR0ZXJuKGNvdW50ZXIpID09PSBzZWxmLkFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2VNdXN0U3RhcnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIHBhdHRlcm5TdGFydCAtICgoaSAtIHBhdHRlcm5TdGFydCkgLyA0KSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwYXR0ZXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJbMF0gKyBjb3VudGVyWzFdO1xuICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcls3XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlcls4XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUzOVJlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvY29kZV8zOV9yZWFkZXIuanMiLCJtb2R1bGUuZXhwb3J0cyA9IGRvdFxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXVxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9nbC12ZWMyL2RvdC5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX01hcC5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX01hcENhY2hlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduTWVyZ2VWYWx1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanNcbi8vIG1vZHVsZSBpZCA9IDM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2ZyZWVHbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRQcm90b3R5cGUuanNcbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fb3ZlclJlc3QuanNcbi8vIG1vZHVsZSBpZCA9IDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zZXRUb1N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaWRlbnRpdHkuanNcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNCdWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc1R5cGVkQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gva2V5c0luLmpzXG4vLyBtb2R1bGUgaWQgPSA0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBUeXBlRGVmcyBmcm9tICcuL2NvbW1vbi90eXBlZGVmcyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgQmFyY29kZUxvY2F0b3IgZnJvbSAnLi9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvcic7XG5pbXBvcnQgQmFyY29kZURlY29kZXIgZnJvbSAnLi9kZWNvZGVyL2JhcmNvZGVfZGVjb2Rlcic7XG5pbXBvcnQgRXZlbnRzIGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgQ2FtZXJhQWNjZXNzIGZyb20gJy4vaW5wdXQvY2FtZXJhX2FjY2Vzcyc7XG5pbXBvcnQgSW1hZ2VEZWJ1ZyBmcm9tICcuL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgUmVzdWx0Q29sbGVjdG9yIGZyb20gJy4vYW5hbHl0aWNzL3Jlc3VsdF9jb2xsZWN0b3InO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xuaW1wb3J0IElucHV0U3RyZWFtIGZyb20gJ2lucHV0X3N0cmVhbSc7XG5pbXBvcnQgRnJhbWVHcmFiYmVyIGZyb20gJ2ZyYW1lX2dyYWJiZXInO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAnbG9kYXNoJztcbmNvbnN0IHZlYzIgPSB7XG4gICAgY2xvbmU6IHJlcXVpcmUoJ2dsLXZlYzIvY2xvbmUnKVxufTtcblxudmFyIF9pbnB1dFN0cmVhbSxcbiAgICBfZnJhbWVncmFiYmVyLFxuICAgIF9zdG9wcGVkLFxuICAgIF9jYW52YXNDb250YWluZXIgPSB7XG4gICAgICAgIGN0eDoge1xuICAgICAgICAgICAgaW1hZ2U6IG51bGwsXG4gICAgICAgICAgICBvdmVybGF5OiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIGRvbToge1xuICAgICAgICAgICAgaW1hZ2U6IG51bGwsXG4gICAgICAgICAgICBvdmVybGF5OiBudWxsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIF9pbnB1dEltYWdlV3JhcHBlcixcbiAgICBfYm94U2l6ZSxcbiAgICBfZGVjb2RlcixcbiAgICBfd29ya2VyUG9vbCA9IFtdLFxuICAgIF9vblVJVGhyZWFkID0gdHJ1ZSxcbiAgICBfcmVzdWx0Q29sbGVjdG9yLFxuICAgIF9jb25maWcgPSB7fTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyKSB7XG4gICAgaW5pdEJ1ZmZlcnMoaW1hZ2VXcmFwcGVyKTtcbiAgICBfZGVjb2RlciA9IEJhcmNvZGVEZWNvZGVyLmNyZWF0ZShfY29uZmlnLmRlY29kZXIsIF9pbnB1dEltYWdlV3JhcHBlcik7XG59XG5cbmZ1bmN0aW9uIGluaXRJbnB1dFN0cmVhbShjYikge1xuICAgIHZhciB2aWRlbztcbiAgICBpZiAoX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSBcIlZpZGVvU3RyZWFtXCIpIHtcbiAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7XG4gICAgICAgIF9pbnB1dFN0cmVhbSA9IElucHV0U3RyZWFtLmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTtcbiAgICB9IGVsc2UgaWYgKF9jb25maWcuaW5wdXRTdHJlYW0udHlwZSA9PT0gXCJJbWFnZVN0cmVhbVwiKSB7XG4gICAgICAgIF9pbnB1dFN0cmVhbSA9IElucHV0U3RyZWFtLmNyZWF0ZUltYWdlU3RyZWFtKCk7XG4gICAgfSBlbHNlIGlmIChfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09IFwiTGl2ZVN0cmVhbVwiKSB7XG4gICAgICAgIHZhciAkdmlld3BvcnQgPSBnZXRWaWV3UG9ydCgpO1xuICAgICAgICBpZiAoJHZpZXdwb3J0KSB7XG4gICAgICAgICAgICB2aWRlbyA9ICR2aWV3cG9ydC5xdWVyeVNlbGVjdG9yKFwidmlkZW9cIik7XG4gICAgICAgICAgICBpZiAoIXZpZGVvKSB7XG4gICAgICAgICAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7XG4gICAgICAgICAgICAgICAgJHZpZXdwb3J0LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfaW5wdXRTdHJlYW0gPSBJbnB1dFN0cmVhbS5jcmVhdGVMaXZlU3RyZWFtKHZpZGVvKTtcbiAgICAgICAgQ2FtZXJhQWNjZXNzLnJlcXVlc3QodmlkZW8sIF9jb25maWcuaW5wdXRTdHJlYW0uY29uc3RyYWludHMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIF9pbnB1dFN0cmVhbS50cmlnZ2VyKFwiY2FucmVjb3JkXCIpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2lucHV0U3RyZWFtLnNldEF0dHJpYnV0ZShcInByZWxvYWRcIiwgXCJhdXRvXCIpO1xuICAgIF9pbnB1dFN0cmVhbS5zZXRJbnB1dFN0cmVhbShfY29uZmlnLmlucHV0U3RyZWFtKTtcbiAgICBfaW5wdXRTdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcihcImNhbnJlY29yZFwiLCBjYW5SZWNvcmQuYmluZCh1bmRlZmluZWQsIGNiKSk7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdQb3J0KCkge1xuICAgIHZhciB0YXJnZXQgPSBfY29uZmlnLmlucHV0U3RyZWFtLnRhcmdldDtcbiAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYWxyZWFkeSBhIERPTSBlbGVtZW50XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlICcjaW50ZXJhY3RpdmUudmlld3BvcnQnIGFzIGEgZmFsbGJhY2sgc2VsZWN0b3IgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IHRhcmdldCA6ICcjaW50ZXJhY3RpdmUudmlld3BvcnQnO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYW5SZWNvcmQoY2IpIHtcbiAgICBCYXJjb2RlTG9jYXRvci5jaGVja0ltYWdlQ29uc3RyYWludHMoX2lucHV0U3RyZWFtLCBfY29uZmlnLmxvY2F0b3IpO1xuICAgIGluaXRDYW52YXMoX2NvbmZpZyk7XG4gICAgX2ZyYW1lZ3JhYmJlciA9IEZyYW1lR3JhYmJlci5jcmVhdGUoX2lucHV0U3RyZWFtLCBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSk7XG5cbiAgICBhZGp1c3RXb3JrZXJQb29sKF9jb25maWcubnVtT2ZXb3JrZXJzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKF9jb25maWcubnVtT2ZXb3JrZXJzID09PSAwKSB7XG4gICAgICAgICAgICBpbml0aWFsaXplRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlYWR5KGNiKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZHkoY2Ipe1xuICAgIF9pbnB1dFN0cmVhbS5wbGF5KCk7XG4gICAgY2IoKTtcbn1cblxuZnVuY3Rpb24gaW5pdENhbnZhcygpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHZhciAkdmlld3BvcnQgPSBnZXRWaWV3UG9ydCgpO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJjYW52YXMuaW1nQnVmZmVyXCIpO1xuICAgICAgICBpZiAoIV9jYW52YXNDb250YWluZXIuZG9tLmltYWdlKSB7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5jbGFzc05hbWUgPSBcImltZ0J1ZmZlclwiO1xuICAgICAgICAgICAgaWYgKCR2aWV3cG9ydCAmJiBfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09IFwiSW1hZ2VTdHJlYW1cIikge1xuICAgICAgICAgICAgICAgICR2aWV3cG9ydC5hcHBlbmRDaGlsZChfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5jdHguaW1hZ2UgPSBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlLndpZHRoID0gX2lucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKS54O1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5oZWlnaHQgPSBfaW5wdXRTdHJlYW0uZ2V0Q2FudmFzU2l6ZSgpLnk7XG5cbiAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJjYW52YXMuZHJhd2luZ0J1ZmZlclwiKTtcbiAgICAgICAgaWYgKCFfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5KSB7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkuY2xhc3NOYW1lID0gXCJkcmF3aW5nQnVmZmVyXCI7XG4gICAgICAgICAgICBpZiAoJHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgJHZpZXdwb3J0LmFwcGVuZENoaWxkKF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNsZWFyRml4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpO1xuICAgICAgICAgICAgY2xlYXJGaXguc2V0QXR0cmlidXRlKFwiY2xlYXJcIiwgXCJhbGxcIik7XG4gICAgICAgICAgICBpZiAoJHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgJHZpZXdwb3J0LmFwcGVuZENoaWxkKGNsZWFyRml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmN0eC5vdmVybGF5ID0gX2NhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkud2lkdGggPSBfaW5wdXRTdHJlYW0uZ2V0Q2FudmFzU2l6ZSgpLng7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkuaGVpZ2h0ID0gX2lucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKS55O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5pdEJ1ZmZlcnMoaW1hZ2VXcmFwcGVyKSB7XG4gICAgaWYgKGltYWdlV3JhcHBlcikge1xuICAgICAgICBfaW5wdXRJbWFnZVdyYXBwZXIgPSBpbWFnZVdyYXBwZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2lucHV0SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICB4OiBfaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSxcbiAgICAgICAgICAgIHk6IF9pbnB1dFN0cmVhbS5nZXRIZWlnaHQoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKF9pbnB1dEltYWdlV3JhcHBlci5zaXplKTtcbiAgICB9XG4gICAgX2JveFNpemUgPSBbXG4gICAgICAgIHZlYzIuY2xvbmUoWzAsIDBdKSxcbiAgICAgICAgdmVjMi5jbG9uZShbMCwgX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICB2ZWMyLmNsb25lKFtfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54LCBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS55XSksXG4gICAgICAgIHZlYzIuY2xvbmUoW19pbnB1dEltYWdlV3JhcHBlci5zaXplLngsIDBdKVxuICAgIF07XG4gICAgQmFyY29kZUxvY2F0b3IuaW5pdChfaW5wdXRJbWFnZVdyYXBwZXIsIF9jb25maWcubG9jYXRvcik7XG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQm94ZXMoKSB7XG4gICAgaWYgKF9jb25maWcubG9jYXRlKSB7XG4gICAgICAgIHJldHVybiBCYXJjb2RlTG9jYXRvci5sb2NhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1tcbiAgICAgICAgICAgIHZlYzIuY2xvbmUoX2JveFNpemVbMF0pLFxuICAgICAgICAgICAgdmVjMi5jbG9uZShfYm94U2l6ZVsxXSksXG4gICAgICAgICAgICB2ZWMyLmNsb25lKF9ib3hTaXplWzJdKSxcbiAgICAgICAgICAgIHZlYzIuY2xvbmUoX2JveFNpemVbM10pXV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1SZXN1bHQocmVzdWx0KSB7XG4gICAgdmFyIHRvcFJpZ2h0ID0gX2lucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCksXG4gICAgICAgIHhPZmZzZXQgPSB0b3BSaWdodC54LFxuICAgICAgICB5T2Zmc2V0ID0gdG9wUmlnaHQueSxcbiAgICAgICAgaTtcblxuICAgIGlmICh4T2Zmc2V0ID09PSAwICYmIHlPZmZzZXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYmFyY29kZXMpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC5iYXJjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHJhbnNmb3JtUmVzdWx0KHJlc3VsdC5iYXJjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmxpbmUgJiYgcmVzdWx0LmxpbmUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIG1vdmVMaW5lKHJlc3VsdC5saW5lKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmJveCkge1xuICAgICAgICBtb3ZlQm94KHJlc3VsdC5ib3gpO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYm94ZXMgJiYgcmVzdWx0LmJveGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC5ib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbW92ZUJveChyZXN1bHQuYm94ZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZUJveChib3gpIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGJveC5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGNvcm5lci0tKSB7XG4gICAgICAgICAgICBib3hbY29ybmVyXVswXSArPSB4T2Zmc2V0O1xuICAgICAgICAgICAgYm94W2Nvcm5lcl1bMV0gKz0geU9mZnNldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmVMaW5lKGxpbmUpIHtcbiAgICAgICAgbGluZVswXS54ICs9IHhPZmZzZXQ7XG4gICAgICAgIGxpbmVbMF0ueSArPSB5T2Zmc2V0O1xuICAgICAgICBsaW5lWzFdLnggKz0geE9mZnNldDtcbiAgICAgICAgbGluZVsxXS55ICs9IHlPZmZzZXQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRSZXN1bHQgKHJlc3VsdCwgaW1hZ2VEYXRhKSB7XG4gICAgaWYgKCFpbWFnZURhdGEgfHwgIV9yZXN1bHRDb2xsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYmFyY29kZXMpIHtcbiAgICAgICAgcmVzdWx0LmJhcmNvZGVzLmZpbHRlcihiYXJjb2RlID0+IGJhcmNvZGUuY29kZVJlc3VsdClcbiAgICAgICAgICAgIC5mb3JFYWNoKGJhcmNvZGUgPT4gYWRkUmVzdWx0KGJhcmNvZGUsIGltYWdlRGF0YSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0LmNvZGVSZXN1bHQpIHtcbiAgICAgICAgX3Jlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQoaW1hZ2VEYXRhLCBfaW5wdXRTdHJlYW0uZ2V0Q2FudmFzU2l6ZSgpLCByZXN1bHQuY29kZVJlc3VsdCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYXNDb2RlUmVzdWx0IChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0ICYmIChyZXN1bHQuYmFyY29kZXMgP1xuICAgICAgcmVzdWx0LmJhcmNvZGVzLnNvbWUoYmFyY29kZSA9PiBiYXJjb2RlLmNvZGVSZXN1bHQpIDpcbiAgICAgIHJlc3VsdC5jb2RlUmVzdWx0KTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaFJlc3VsdChyZXN1bHQsIGltYWdlRGF0YSkge1xuICAgIGxldCByZXN1bHRUb1B1Ymxpc2ggPSByZXN1bHQ7XG5cbiAgICBpZiAocmVzdWx0ICYmIF9vblVJVGhyZWFkKSB7XG4gICAgICAgIHRyYW5zZm9ybVJlc3VsdChyZXN1bHQpO1xuICAgICAgICBhZGRSZXN1bHQocmVzdWx0LCBpbWFnZURhdGEpO1xuICAgICAgICByZXN1bHRUb1B1Ymxpc2ggPSByZXN1bHQuYmFyY29kZXMgfHwgcmVzdWx0O1xuICAgIH1cblxuICAgIEV2ZW50cy5wdWJsaXNoKFwicHJvY2Vzc2VkXCIsIHJlc3VsdFRvUHVibGlzaCk7XG4gICAgaWYgKGhhc0NvZGVSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICBFdmVudHMucHVibGlzaChcImRldGVjdGVkXCIsIHJlc3VsdFRvUHVibGlzaCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NhdGVBbmREZWNvZGUoKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgYm94ZXM7XG5cbiAgICBib3hlcyA9IGdldEJvdW5kaW5nQm94ZXMoKTtcbiAgICBpZiAoYm94ZXMpIHtcbiAgICAgICAgcmVzdWx0ID0gX2RlY29kZXIuZGVjb2RlRnJvbUJvdW5kaW5nQm94ZXMoYm94ZXMpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdC5ib3hlcyA9IGJveGVzO1xuICAgICAgICBwdWJsaXNoUmVzdWx0KHJlc3VsdCwgX2lucHV0SW1hZ2VXcmFwcGVyLmRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHB1Ymxpc2hSZXN1bHQoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgYXZhaWxhYmxlV29ya2VyO1xuXG4gICAgaWYgKF9vblVJVGhyZWFkKSB7XG4gICAgICAgIGlmIChfd29ya2VyUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhdmFpbGFibGVXb3JrZXIgPSBfd29ya2VyUG9vbC5maWx0ZXIoZnVuY3Rpb24od29ya2VyVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF3b3JrZXJUaHJlYWQuYnVzeTtcbiAgICAgICAgICAgIH0pWzBdO1xuICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdvcmtlcikge1xuICAgICAgICAgICAgICAgIF9mcmFtZWdyYWJiZXIuYXR0YWNoRGF0YShhdmFpbGFibGVXb3JrZXIuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhbGwgd29ya2VycyBhcmUgYnVzeVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZyYW1lZ3JhYmJlci5hdHRhY2hEYXRhKF9pbnB1dEltYWdlV3JhcHBlci5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2ZyYW1lZ3JhYmJlci5ncmFiKCkpIHtcbiAgICAgICAgICAgIGlmIChhdmFpbGFibGVXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXb3JrZXIuYnVzeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV29ya2VyLndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGNtZDogJ3Byb2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGE6IGF2YWlsYWJsZVdvcmtlci5pbWFnZURhdGFcbiAgICAgICAgICAgICAgICB9LCBbYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YS5idWZmZXJdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9jYXRlQW5kRGVjb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhdGVBbmREZWNvZGUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29udGludW91c1VwZGF0ZSgpIHtcbiAgICB2YXIgbmV4dCA9IG51bGwsXG4gICAgICAgIGRlbGF5ID0gMTAwMCAvIChfY29uZmlnLmZyZXF1ZW5jeSB8fCA2MCk7XG5cbiAgICBfc3RvcHBlZCA9IGZhbHNlO1xuICAgIChmdW5jdGlvbiBmcmFtZSh0aW1lc3RhbXApIHtcbiAgICAgICAgbmV4dCA9IG5leHQgfHwgdGltZXN0YW1wO1xuICAgICAgICBpZiAoIV9zdG9wcGVkKSB7XG4gICAgICAgICAgICBpZiAodGltZXN0YW1wID49IG5leHQpIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IGRlbGF5O1xuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfShwZXJmb3JtYW5jZS5ub3coKSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoX29uVUlUaHJlYWQgJiYgX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSBcIkxpdmVTdHJlYW1cIikge1xuICAgICAgICBzdGFydENvbnRpbnVvdXNVcGRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGluaXRXb3JrZXIoY2IpIHtcbiAgICB2YXIgYmxvYlVSTCxcbiAgICAgICAgd29ya2VyVGhyZWFkID0ge1xuICAgICAgICAgICAgd29ya2VyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbWFnZURhdGE6IG5ldyBVaW50OEFycmF5KF9pbnB1dFN0cmVhbS5nZXRXaWR0aCgpICogX2lucHV0U3RyZWFtLmdldEhlaWdodCgpKSxcbiAgICAgICAgICAgIGJ1c3k6IHRydWVcbiAgICAgICAgfTtcblxuICAgIGJsb2JVUkwgPSBnZW5lcmF0ZVdvcmtlckJsb2IoKTtcbiAgICB3b3JrZXJUaHJlYWQud29ya2VyID0gbmV3IFdvcmtlcihibG9iVVJMKTtcblxuICAgIHdvcmtlclRocmVhZC53b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS5kYXRhLmV2ZW50ID09PSAnaW5pdGlhbGl6ZWQnKSB7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVUkwpO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIldvcmtlciBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYih3b3JrZXJUaHJlYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ3Byb2Nlc3NlZCcpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICBwdWJsaXNoUmVzdWx0KGUuZGF0YS5yZXN1bHQsIHdvcmtlclRocmVhZC5pbWFnZURhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV29ya2VyIGVycm9yOiBcIiArIGUuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB3b3JrZXJUaHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgY21kOiAnaW5pdCcsXG4gICAgICAgIHNpemU6IHt4OiBfaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSwgeTogX2lucHV0U3RyZWFtLmdldEhlaWdodCgpfSxcbiAgICAgICAgaW1hZ2VEYXRhOiB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhLFxuICAgICAgICBjb25maWc6IGNvbmZpZ0ZvcldvcmtlcihfY29uZmlnKVxuICAgIH0sIFt3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhLmJ1ZmZlcl0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdGb3JXb3JrZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICAgICAgLi4uY29uZmlnLmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgdGFyZ2V0OiBudWxsXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiB3b3JrZXJJbnRlcmZhY2UoZmFjdG9yeSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmKi9cbiAgICBpZiAoZmFjdG9yeSkge1xuICAgICAgICB2YXIgUXVhZ2dhID0gZmFjdG9yeSgpLmRlZmF1bHQ7XG4gICAgICAgIGlmICghUXVhZ2dhKSB7XG4gICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsnZXZlbnQnOiAnZXJyb3InLCBtZXNzYWdlOiAnUXVhZ2dhIGNvdWxkIG5vdCBiZSBjcmVhdGVkJ30pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBpbWFnZVdyYXBwZXI7XG5cbiAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUuZGF0YS5jbWQgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGUuZGF0YS5jb25maWc7XG4gICAgICAgICAgICBjb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgICAgIGltYWdlV3JhcHBlciA9IG5ldyBRdWFnZ2EuSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgICAgICB4OiBlLmRhdGEuc2l6ZS54LFxuICAgICAgICAgICAgICAgIHk6IGUuZGF0YS5zaXplLnlcbiAgICAgICAgICAgIH0sIG5ldyBVaW50OEFycmF5KGUuZGF0YS5pbWFnZURhdGEpKTtcbiAgICAgICAgICAgIFF1YWdnYS5pbml0KGNvbmZpZywgcmVhZHksIGltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICBRdWFnZ2Eub25Qcm9jZXNzZWQob25Qcm9jZXNzZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5jbWQgPT09ICdwcm9jZXNzJykge1xuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIFF1YWdnYS5zdGFydCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5jbWQgPT09ICdzZXRSZWFkZXJzJykge1xuICAgICAgICAgICAgUXVhZ2dhLnNldFJlYWRlcnMoZS5kYXRhLnJlYWRlcnMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG9uUHJvY2Vzc2VkKHJlc3VsdCkge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICdldmVudCc6ICdwcm9jZXNzZWQnLFxuICAgICAgICAgICAgaW1hZ2VEYXRhOiBpbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICAgIH0sIFtpbWFnZVdyYXBwZXIuZGF0YS5idWZmZXJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkeSgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsnZXZlbnQnOiAnaW5pdGlhbGl6ZWQnLCBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl0pO1xuICAgIH1cblxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZXJCbG9iKCkge1xuICAgIHZhciBibG9iLFxuICAgICAgICBmYWN0b3J5U291cmNlO1xuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0eXBlb2YgX19mYWN0b3J5U291cmNlX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZhY3RvcnlTb3VyY2UgPSBfX2ZhY3RvcnlTb3VyY2VfXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgYmxvYiA9IG5ldyBCbG9iKFsnKCcgKyB3b3JrZXJJbnRlcmZhY2UudG9TdHJpbmcoKSArICcpKCcgKyBmYWN0b3J5U291cmNlICsgJyk7J10sXG4gICAgICAgIHt0eXBlOiAndGV4dC9qYXZhc2NyaXB0J30pO1xuXG4gICAgcmV0dXJuIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xufVxuXG5mdW5jdGlvbiBzZXRSZWFkZXJzKHJlYWRlcnMpIHtcbiAgICBpZiAoX2RlY29kZXIpIHtcbiAgICAgICAgX2RlY29kZXIuc2V0UmVhZGVycyhyZWFkZXJzKTtcbiAgICB9IGVsc2UgaWYgKF9vblVJVGhyZWFkICYmIF93b3JrZXJQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgX3dvcmtlclBvb2wuZm9yRWFjaChmdW5jdGlvbih3b3JrZXJUaHJlYWQpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ3NldFJlYWRlcnMnLCByZWFkZXJzOiByZWFkZXJzfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRqdXN0V29ya2VyUG9vbChjYXBhY2l0eSwgY2IpIHtcbiAgICBjb25zdCBpbmNyZWFzZUJ5ID0gY2FwYWNpdHkgLSBfd29ya2VyUG9vbC5sZW5ndGg7XG4gICAgaWYgKGluY3JlYXNlQnkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNiICYmIGNiKCk7XG4gICAgfVxuICAgIGlmIChpbmNyZWFzZUJ5IDwgMCkge1xuICAgICAgICBjb25zdCB3b3JrZXJzVG9UZXJtaW5hdGUgPSBfd29ya2VyUG9vbC5zbGljZShpbmNyZWFzZUJ5KTtcbiAgICAgICAgd29ya2Vyc1RvVGVybWluYXRlLmZvckVhY2goZnVuY3Rpb24od29ya2VyVGhyZWFkKSB7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQud29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV29ya2VyIHRlcm1pbmF0ZWQhXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgX3dvcmtlclBvb2wgPSBfd29ya2VyUG9vbC5zbGljZSgwLCBpbmNyZWFzZUJ5KTtcbiAgICAgICAgcmV0dXJuIGNiICYmIGNiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmNyZWFzZUJ5OyBpKyspIHtcbiAgICAgICAgICAgIGluaXRXb3JrZXIod29ya2VySW5pdGlhbGl6ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gd29ya2VySW5pdGlhbGl6ZWQod29ya2VyVGhyZWFkKSB7XG4gICAgICAgICAgICBfd29ya2VyUG9vbC5wdXNoKHdvcmtlclRocmVhZCk7XG4gICAgICAgICAgICBpZiAoX3dvcmtlclBvb2wubGVuZ3RoID49IGNhcGFjaXR5KXtcbiAgICAgICAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgaW5pdDogZnVuY3Rpb24oY29uZmlnLCBjYiwgaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIF9jb25maWcgPSBtZXJnZSh7fSwgQ29uZmlnLCBjb25maWcpO1xuICAgICAgICBpZiAoaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgICAgICBfb25VSVRocmVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5pdElucHV0U3RyZWFtKGNiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdGFydCgpO1xuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIF9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgYWRqdXN0V29ya2VyUG9vbCgwKTtcbiAgICAgICAgaWYgKF9jb25maWcuaW5wdXRTdHJlYW0udHlwZSA9PT0gXCJMaXZlU3RyZWFtXCIpIHtcbiAgICAgICAgICAgIENhbWVyYUFjY2Vzcy5yZWxlYXNlKCk7XG4gICAgICAgICAgICBfaW5wdXRTdHJlYW0uY2xlYXJFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHBhdXNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgX3N0b3BwZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25EZXRlY3RlZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZShcImRldGVjdGVkXCIsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIG9mZkRldGVjdGVkOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICBFdmVudHMudW5zdWJzY3JpYmUoXCJkZXRlY3RlZFwiLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBvblByb2Nlc3NlZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZShcInByb2Nlc3NlZFwiLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBvZmZQcm9jZXNzZWQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIEV2ZW50cy51bnN1YnNjcmliZShcInByb2Nlc3NlZFwiLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBzZXRSZWFkZXJzOiBmdW5jdGlvbihyZWFkZXJzKSB7XG4gICAgICAgIHNldFJlYWRlcnMocmVhZGVycyk7XG4gICAgfSxcbiAgICByZWdpc3RlclJlc3VsdENvbGxlY3RvcjogZnVuY3Rpb24ocmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgIGlmIChyZXN1bHRDb2xsZWN0b3IgJiYgdHlwZW9mIHJlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9yZXN1bHRDb2xsZWN0b3IgPSByZXN1bHRDb2xsZWN0b3I7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNhbnZhczogX2NhbnZhc0NvbnRhaW5lcixcbiAgICBkZWNvZGVTaW5nbGU6IGZ1bmN0aW9uKGNvbmZpZywgcmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgY29uZmlnID0gbWVyZ2Uoe1xuICAgICAgICAgICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkltYWdlU3RyZWFtXCIsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNpemU6IDgwMCxcbiAgICAgICAgICAgICAgICBzcmM6IGNvbmZpZy5zcmNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudW1PZldvcmtlcnM6IChFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnKSA/IDAgOiAxLFxuICAgICAgICAgICAgbG9jYXRvcjoge1xuICAgICAgICAgICAgICAgIGhhbGZTYW1wbGU6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaW5pdChjb25maWcsICgpID0+IHtcbiAgICAgICAgICAgIEV2ZW50cy5vbmNlKFwicHJvY2Vzc2VkXCIsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjay5jYWxsKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgICAgIHN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgSW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsXG4gICAgSW1hZ2VEZWJ1ZzogSW1hZ2VEZWJ1ZyxcbiAgICBSZXN1bHRDb2xsZWN0b3I6IFJlc3VsdENvbGxlY3RvcixcbiAgICBDYW1lcmFBY2Nlc3M6IENhbWVyYUFjY2Vzcyxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVhZ2dhLmpzIiwiaW1wb3J0IEltYWdlRGVidWcgZnJvbSAnLi4vY29tbW9uL2ltYWdlX2RlYnVnJztcblxuZnVuY3Rpb24gY29udGFpbnMoY29kZVJlc3VsdCwgbGlzdCkge1xuICAgIGlmIChsaXN0KSB7XG4gICAgICAgIHJldHVybiBsaXN0LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpdGVtKS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gY29kZVJlc3VsdFtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhc3Nlc0ZpbHRlcihjb2RlUmVzdWx0LCBmaWx0ZXIpIHtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmlsdGVyKGNvZGVSZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLFxuICAgICAgICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSxcbiAgICAgICAgICAgIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgICAgIGNhcGFjaXR5ID0gY29uZmlnLmNhcGFjaXR5IHx8IDIwLFxuICAgICAgICAgICAgY2FwdHVyZSA9IGNvbmZpZy5jYXB0dXJlID09PSB0cnVlO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1hdGNoZXNDb25zdHJhaW50cyhjb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FwYWNpdHlcbiAgICAgICAgICAgICAgICAmJiBjb2RlUmVzdWx0XG4gICAgICAgICAgICAgICAgJiYgIWNvbnRhaW5zKGNvZGVSZXN1bHQsIGNvbmZpZy5ibGFja2xpc3QpXG4gICAgICAgICAgICAgICAgJiYgcGFzc2VzRmlsdGVyKGNvZGVSZXN1bHQsIGNvbmZpZy5maWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZFJlc3VsdDogZnVuY3Rpb24oZGF0YSwgaW1hZ2VTaXplLCBjb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNDb25zdHJhaW50cyhjb2RlUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eS0tO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29kZVJlc3VsdCA9IGNvZGVSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWFnZVNpemUueDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZVNpemUueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd0ltYWdlKGRhdGEsIGltYWdlU2l6ZSwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5mcmFtZSA9IGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVzdWx0czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9hbmFseXRpY3MvcmVzdWx0X2NvbGxlY3Rvci5qcyIsImNvbnN0IHZlYzIgPSB7XG4gICAgY2xvbmU6IHJlcXVpcmUoJ2dsLXZlYzIvY2xvbmUnKSxcbiAgICBkb3Q6IHJlcXVpcmUoJ2dsLXZlYzIvZG90Jylcbn1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2x1c3RlciBmb3IgZ3JvdXBpbmcgc2ltaWxhciBvcmllbnRhdGlvbnMgb2YgZGF0YXBvaW50c1xuICAgICAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24ocG9pbnQsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgcG9pbnRzID0gW10sXG4gICAgICAgICAgICBjZW50ZXIgPSB7XG4gICAgICAgICAgICAgICAgcmFkOiAwLFxuICAgICAgICAgICAgICAgIHZlYzogdmVjMi5jbG9uZShbMCwgMF0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9pbnRNYXAgPSB7fTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgYWRkKHBvaW50KTtcbiAgICAgICAgICAgIHVwZGF0ZUNlbnRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkKHBvaW50VG9BZGQpIHtcbiAgICAgICAgICAgIHBvaW50TWFwW3BvaW50VG9BZGQuaWRdID0gcG9pbnRUb0FkZDtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50VG9BZGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2VudGVyKCkge1xuICAgICAgICAgICAgdmFyIGksIHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1bSArPSBwb2ludHNbaV0ucmFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VudGVyLnJhZCA9IHN1bSAvIHBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICBjZW50ZXIudmVjID0gdmVjMi5jbG9uZShbTWF0aC5jb3MoY2VudGVyLnJhZCksIE1hdGguc2luKGNlbnRlci5yYWQpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24ocG9pbnRUb0FkZCkge1xuICAgICAgICAgICAgICAgIGlmICghcG9pbnRNYXBbcG9pbnRUb0FkZC5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkKHBvaW50VG9BZGQpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZml0czogZnVuY3Rpb24ob3RoZXJQb2ludCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGNvc2luZSBzaW1pbGFyaXR5IHRvIGNlbnRlci1hbmdsZVxuICAgICAgICAgICAgICAgIHZhciBzaW1pbGFyaXR5ID0gTWF0aC5hYnModmVjMi5kb3Qob3RoZXJQb2ludC5wb2ludC52ZWMsIGNlbnRlci52ZWMpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFBvaW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjZW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVQb2ludDogZnVuY3Rpb24obmV3UG9pbnQsIGlkLCBwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFkOiBuZXdQb2ludFtwcm9wZXJ0eV0sXG4gICAgICAgICAgICBwb2ludDogbmV3UG9pbnQsXG4gICAgICAgICAgICBpZDogaWRcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9jbHVzdGVyLmpzIiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uKCkge1xuICAgIHZhciBldmVudHMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGdldEV2ZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoIWV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICBldmVudHNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50c1tldmVudE5hbWVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyRXZlbnRzKCl7XG4gICAgICAgIGV2ZW50cyA9IHt9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1Ymxpc2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSwgNCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmUoZXZlbnQsIGNhbGxiYWNrLCBhc3luYykge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uO1xuXG4gICAgICAgIGlmICggdHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgYXN5bmM6IGFzeW5jXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbi5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRocm93IFwiQ2FsbGJhY2sgd2FzIG5vdCBzcGVjaWZpZWQgb24gb3B0aW9uc1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2V0RXZlbnQoZXZlbnQpLnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKGV2ZW50LCBjYWxsYmFjaywgYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmUoZXZlbnQsIGNhbGxiYWNrLCBhc3luYyk7XG4gICAgICAgIH0sXG4gICAgICAgIHB1Ymxpc2g6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gZ2V0RXZlbnQoZXZlbnROYW1lKSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVycyA9IGV2ZW50LnN1YnNjcmliZXJzO1xuXG4gICAgICAgICAgICAvLyBQdWJsaXNoIG9uZS10aW1lIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgIHN1YnNjcmliZXJzLmZpbHRlcihmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhc3Vic2NyaWJlci5vbmNlO1xuICAgICAgICAgICAgfSkuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHB1Ymxpc2hTdWJzY3JpcHRpb24oc3Vic2NyaWJlciwgZGF0YSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc3Vic2NyaWJlclxuICAgICAgICAgICAgZXZlbnQuc3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiAhc3Vic2NyaWJlci5vbmNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggdGhlIHJlc3RcbiAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmliZXIsIGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uY2U6IGZ1bmN0aW9uKGV2ZW50LCBjYWxsYmFjaywgYXN5bmMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZShldmVudCwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICBhc3luYzogYXN5bmMsXG4gICAgICAgICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnQ7XG5cbiAgICAgICAgICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzID0gZXZlbnQuc3Vic2NyaWJlcnMuZmlsdGVyKGZ1bmN0aW9uKHN1YnNjcmliZXIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY2FsbGJhY2sgIT09IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdWJzY3JpYmVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xlYXJFdmVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9ldmVudHMuanMiLCJcbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVEZXZpY2VzKCkge1xuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAgICAgICAmJiB0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZW51bWVyYXRlRGV2aWNlcyBpcyBub3QgZGVmaW5lZCcpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyTWVkaWEoY29uc3RyYWludHMpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgJiYgdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAgICAgICAuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZ2V0VXNlck1lZGlhIGlzIG5vdCBkZWZpbmVkJykpO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi9tZWRpYURldmljZXMuanMiLCIvKipcbiAqIENvbnN0cnVjdCByZXByZXNlbnRpbmcgYSBwYXJ0IG9mIGFub3RoZXIge0ltYWdlV3JhcHBlcn0uIFNoYXJlcyBkYXRhXG4gKiBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZC5cbiAqIEBwYXJhbSBmcm9tIHtJbWFnZVJlZn0gVGhlIHBvc2l0aW9uIHdoZXJlIHRvIHN0YXJ0IHRoZSB7U3ViSW1hZ2V9IGZyb20uICh0b3AtbGVmdCBjb3JuZXIpXG4gKiBAcGFyYW0gc2l6ZSB7SW1hZ2VSZWZ9IFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgaW1hZ2VcbiAqIEBwYXJhbSBJIHtJbWFnZVdyYXBwZXJ9IFRoZSB7SW1hZ2VXcmFwcGVyfSB0byBzaGFyZSBmcm9tXG4gKiBAcmV0dXJucyB7U3ViSW1hZ2V9IEEgc2hhcmVkIHBhcnQgb2YgdGhlIG9yaWdpbmFsIGltYWdlXG4gKi9cbmZ1bmN0aW9uIFN1YkltYWdlKGZyb20sIHNpemUsIEkpIHtcbiAgICBpZiAoIUkpIHtcbiAgICAgICAgSSA9IHtcbiAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICBzaXplOiBzaXplXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuZGF0YSA9IEkuZGF0YTtcbiAgICB0aGlzLm9yaWdpbmFsU2l6ZSA9IEkuc2l6ZTtcbiAgICB0aGlzLkkgPSBJO1xuXG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLnNpemUgPSBzaXplO1xufVxuXG4vKipcbiAqIERpc3BsYXlzIHRoZSB7U3ViSW1hZ2V9IGluIGEgZ2l2ZW4gY2FudmFzXG4gKiBAcGFyYW0gY2FudmFzIHtDYW52YXN9IFRoZSBjYW52YXMgZWxlbWVudCB0byB3cml0ZSB0b1xuICogQHBhcmFtIHNjYWxlIHtOdW1iZXJ9IFNjYWxlIHdoaWNoIGlzIGFwcGxpZWQgdG8gZWFjaCBwaXhlbC12YWx1ZVxuICovXG5TdWJJbWFnZS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGNhbnZhcywgc2NhbGUpIHtcbiAgICB2YXIgY3R4LFxuICAgICAgICBmcmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgeSxcbiAgICAgICAgeCxcbiAgICAgICAgcGl4ZWw7XG5cbiAgICBpZiAoIXNjYWxlKSB7XG4gICAgICAgIHNjYWxlID0gMS4wO1xuICAgIH1cbiAgICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjYW52YXMud2lkdGggPSB0aGlzLnNpemUueDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgZnJhbWUgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgZGF0YSA9IGZyYW1lLmRhdGE7XG4gICAgY3VycmVudCA9IDA7XG4gICAgZm9yICh5ID0gMDsgeSA8IHRoaXMuc2l6ZS55OyB5KyspIHtcbiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHRoaXMuc2l6ZS54OyB4KyspIHtcbiAgICAgICAgICAgIHBpeGVsID0geSAqIHRoaXMuc2l6ZS54ICsgeDtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmdldCh4LCB5KSAqIHNjYWxlO1xuICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAwXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBkYXRhW3BpeGVsICogNCArIDFdID0gY3VycmVudDtcbiAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgMl0gPSBjdXJyZW50O1xuICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcmFtZS5kYXRhID0gZGF0YTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gZnJvbSB0aGUge1N1YkltYWdlfVxuICogQHBhcmFtIHgge051bWJlcn0gVGhlIHgtcG9zaXRpb25cbiAqIEBwYXJhbSB5IHtOdW1iZXJ9IFRoZSB5LXBvc2l0aW9uXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgZ3JheXNjYWxlIHZhbHVlIGF0IHRoZSBwaXhlbC1wb3NpdGlvblxuICovXG5TdWJJbWFnZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbKHRoaXMuZnJvbS55ICsgeSkgKiB0aGlzLm9yaWdpbmFsU2l6ZS54ICsgdGhpcy5mcm9tLnggKyB4XTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdW5kZXJseWluZyBkYXRhIGZyb20gYSBnaXZlbiB7SW1hZ2VXcmFwcGVyfVxuICogQHBhcmFtIGltYWdlIHtJbWFnZVdyYXBwZXJ9IFRoZSB1cGRhdGVkIGltYWdlXG4gKi9cblN1YkltYWdlLnByb3RvdHlwZS51cGRhdGVEYXRhID0gZnVuY3Rpb24oaW1hZ2UpIHtcbiAgICB0aGlzLm9yaWdpbmFsU2l6ZSA9IGltYWdlLnNpemU7XG4gICAgdGhpcy5kYXRhID0gaW1hZ2UuZGF0YTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHNoYXJlZCBhcmVhXG4gKiBAcGFyYW0gZnJvbSB7eCx5fSBUaGUgbmV3IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7U3ViSW1hZ2V9IHJldHVybnMge3RoaXN9IGZvciBwb3NzaWJsZSBjaGFpbmluZ1xuICovXG5TdWJJbWFnZS5wcm90b3R5cGUudXBkYXRlRnJvbSA9IGZ1bmN0aW9uKGZyb20pIHtcbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKFN1YkltYWdlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21tb24vc3ViSW1hZ2UuanMiLCIvKlxuICogdHlwZWRlZnMuanNcbiAqIE5vcm1hbGl6ZXMgYnJvd3Nlci1zcGVjaWZpYyBwcmVmaXhlc1xuICovXG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgvKiBmdW5jdGlvbiBGcmFtZVJlcXVlc3RDYWxsYmFjayAqLyBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuICAgICAgICAgICAgfTtcbiAgICB9KSgpO1xufVxuTWF0aC5pbXVsID0gTWF0aC5pbXVsIHx8IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgYWggPSAoYSA+Pj4gMTYpICYgMHhmZmZmLFxuICAgICAgICBhbCA9IGEgJiAweGZmZmYsXG4gICAgICAgIGJoID0gKGIgPj4+IDE2KSAmIDB4ZmZmZixcbiAgICAgICAgYmwgPSBiICYgMHhmZmZmO1xuICAgIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgICAvLyB0aGUgZmluYWwgfDAgY29udmVydHMgdGhlIHVuc2lnbmVkIHZhbHVlIGludG8gYSBzaWduZWQgdmFsdWVcbiAgICByZXR1cm4gKChhbCAqIGJsKSArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApIHwgMCk7XG59O1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24odGFyZ2V0KSB7IC8vIC5sZW5ndGggb2YgZnVuY3Rpb24gaXMgMlxuICAgICAgICAndXNlIHN0cmljdCc7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpIHsgLy8gVHlwZUVycm9yIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlICE9PSBudWxsKSB7IC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gbmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBidWdzIHdoZW4gaGFzT3duUHJvcGVydHkgaXMgc2hhZG93ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0bztcbiAgICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi90eXBlZGVmcy5qcyIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGlucHV0U3RyZWFtOiB7XG4gICAgICAgIG5hbWU6IFwiTGl2ZVwiLFxuICAgICAgICB0eXBlOiBcIkxpdmVTdHJlYW1cIixcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIC8vIGFzcGVjdFJhdGlvOiA2NDAvNDgwLCAvLyBvcHRpb25hbFxuICAgICAgICAgICAgZmFjaW5nTW9kZTogXCJlbnZpcm9ubWVudFwiLCAvLyBvciB1c2VyXG4gICAgICAgICAgICAvLyBkZXZpY2VJZDogXCIzODc0NTk4MzQ1NzM4NzU5ODM3NTk4Mzc1OTgzNFwiXG4gICAgICAgIH0sXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogXCIwJVwiLFxuICAgICAgICAgICAgcmlnaHQ6IFwiMCVcIixcbiAgICAgICAgICAgIGxlZnQ6IFwiMCVcIixcbiAgICAgICAgICAgIGJvdHRvbTogXCIwJVwiXG4gICAgICAgIH0sXG4gICAgICAgIHNpbmdsZUNoYW5uZWw6IGZhbHNlIC8vIHRydWU6IG9ubHkgdGhlIHJlZCBjb2xvci1jaGFubmVsIGlzIHJlYWRcbiAgICB9LFxuICAgIGxvY2F0ZTogdHJ1ZSxcbiAgICBudW1PZldvcmtlcnM6IDAsXG4gICAgZGVjb2Rlcjoge1xuICAgICAgICByZWFkZXJzOiBbXG4gICAgICAgICAgICAnY29kZV8xMjhfcmVhZGVyJ1xuICAgICAgICBdLFxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgZHJhd0JvdW5kaW5nQm94OiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dGcmVxdWVuY3k6IGZhbHNlLFxuICAgICAgICAgICAgZHJhd1NjYW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dQYXR0ZXJuOiBmYWxzZVxuICAgICAgICB9XG4gICAgfSxcbiAgICBsb2NhdG9yOiB7XG4gICAgICAgIGhhbGZTYW1wbGU6IHRydWUsXG4gICAgICAgIHBhdGNoU2l6ZTogXCJtZWRpdW1cIiwgLy8geC1zbWFsbCwgc21hbGwsIG1lZGl1bSwgbGFyZ2UsIHgtbGFyZ2VcbiAgICAgICAgZGVidWc6IHtcbiAgICAgICAgICAgIHNob3dDYW52YXM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdGNoZXM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0ZvdW5kUGF0Y2hlczogZmFsc2UsXG4gICAgICAgICAgICBzaG93U2tlbGV0b246IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0xhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0Y2hMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1JlbWFpbmluZ1BhdGNoTGFiZWxzOiBmYWxzZSxcbiAgICAgICAgICAgIGJveEZyb21QYXRjaGVzOiB7XG4gICAgICAgICAgICAgICAgc2hvd1RyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93VHJhbnNmb3JtZWRCb3g6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dCQjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZmlnL2NvbmZpZy5kZXYuanMiLCJsZXQgY29uZmlnO1xuXG5pZiAoRU5WLmRldmVsb3BtZW50KXtcbiAgICBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZy5kZXYuanMnKTtcbn0gZWxzZSBpZiAoRU5WLm5vZGUpIHtcbiAgICBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZy5ub2RlLmpzJyk7XG59IGVsc2Uge1xuICAgIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnLnByb2QuanMnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmZpZy9jb25maWcuanMiLCJpbXBvcnQgQnJlc2VuaGFtIGZyb20gJy4vYnJlc2VuaGFtJztcbmltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgQ29kZTEyOFJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8xMjhfcmVhZGVyJztcbmltcG9ydCBFQU5SZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8zOV9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVZJTlJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8zOV92aW5fcmVhZGVyJztcbmltcG9ydCBDb2RhYmFyUmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RhYmFyX3JlYWRlcic7XG5pbXBvcnQgVVBDUmVhZGVyIGZyb20gJy4uL3JlYWRlci91cGNfcmVhZGVyJztcbmltcG9ydCBFQU44UmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fOF9yZWFkZXInO1xuaW1wb3J0IEVBTjJSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl8yX3JlYWRlcic7XG5pbXBvcnQgRUFONVJlYWRlciBmcm9tICcuLi9yZWFkZXIvZWFuXzVfcmVhZGVyJztcbmltcG9ydCBVUENFUmVhZGVyIGZyb20gJy4uL3JlYWRlci91cGNfZV9yZWFkZXInO1xuaW1wb3J0IEkyb2Y1UmVhZGVyIGZyb20gJy4uL3JlYWRlci9pMm9mNV9yZWFkZXInO1xuaW1wb3J0IFR3b09mRml2ZVJlYWRlciBmcm9tICcuLi9yZWFkZXIvMm9mNV9yZWFkZXInO1xuaW1wb3J0IENvZGU5M1JlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV85M19yZWFkZXInO1xuXG5jb25zdCBSRUFERVJTID0ge1xuICAgIGNvZGVfMTI4X3JlYWRlcjogQ29kZTEyOFJlYWRlcixcbiAgICBlYW5fcmVhZGVyOiBFQU5SZWFkZXIsXG4gICAgZWFuXzVfcmVhZGVyOiBFQU41UmVhZGVyLFxuICAgIGVhbl8yX3JlYWRlcjogRUFOMlJlYWRlcixcbiAgICBlYW5fOF9yZWFkZXI6IEVBTjhSZWFkZXIsXG4gICAgY29kZV8zOV9yZWFkZXI6IENvZGUzOVJlYWRlcixcbiAgICBjb2RlXzM5X3Zpbl9yZWFkZXI6IENvZGUzOVZJTlJlYWRlcixcbiAgICBjb2RhYmFyX3JlYWRlcjogQ29kYWJhclJlYWRlcixcbiAgICB1cGNfcmVhZGVyOiBVUENSZWFkZXIsXG4gICAgdXBjX2VfcmVhZGVyOiBVUENFUmVhZGVyLFxuICAgIGkyb2Y1X3JlYWRlcjogSTJvZjVSZWFkZXIsXG4gICAgJzJvZjVfcmVhZGVyJzogVHdvT2ZGaXZlUmVhZGVyLFxuICAgIGNvZGVfOTNfcmVhZGVyOiBDb2RlOTNSZWFkZXJcbn07XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbihjb25maWcsIGlucHV0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIHZhciBfY2FudmFzID0ge1xuICAgICAgICAgICAgICAgIGN0eDoge1xuICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXk6IG51bGxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRvbToge1xuICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXk6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2JhcmNvZGVSZWFkZXJzID0gW107XG5cbiAgICAgICAgaW5pdENhbnZhcygpO1xuICAgICAgICBpbml0UmVhZGVycygpO1xuICAgICAgICBpbml0Q29uZmlnKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdENhbnZhcygpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHZhciAkZGVidWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2RlYnVnLmRldGVjdGlvblwiKTtcbiAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiY2FudmFzLmZyZXF1ZW5jeVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIV9jYW52YXMuZG9tLmZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kuY2xhc3NOYW1lID0gXCJmcmVxdWVuY3lcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnLmFwcGVuZENoaWxkKF9jYW52YXMuZG9tLmZyZXF1ZW5jeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2NhbnZhcy5jdHguZnJlcXVlbmN5ID0gX2NhbnZhcy5kb20uZnJlcXVlbmN5LmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiY2FudmFzLnBhdHRlcm5CdWZmZXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2FudmFzLmRvbS5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5wYXR0ZXJuLmNsYXNzTmFtZSA9IFwicGF0dGVybkJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZGVidWcuYXBwZW5kQ2hpbGQoX2NhbnZhcy5kb20ucGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2NhbnZhcy5jdHgucGF0dGVybiA9IF9jYW52YXMuZG9tLnBhdHRlcm4uZ2V0Q29udGV4dChcIjJkXCIpO1xuXG4gICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ub3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJjYW52YXMuZHJhd2luZ0J1ZmZlclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoX2NhbnZhcy5kb20ub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmN0eC5vdmVybGF5ID0gX2NhbnZhcy5kb20ub3ZlcmxheS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdFJlYWRlcnMoKSB7XG4gICAgICAgICAgICBjb25maWcucmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHJlYWRlckNvbmZpZykge1xuICAgICAgICAgICAgICAgIHZhciByZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgc3VwcGxlbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkZXJDb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gcmVhZGVyQ29uZmlnLmNvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWFkZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSByZWdpc3RlcmluZyByZWFkZXI6IFwiLCByZWFkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5zdXBwbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBzdXBwbGVtZW50cyA9IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdXBwbGVtZW50cy5tYXAoKHN1cHBsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJFQURFUlNbc3VwcGxlbWVudF0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfYmFyY29kZVJlYWRlcnMucHVzaChuZXcgUkVBREVSU1tyZWFkZXJdKGNvbmZpZ3VyYXRpb24sIHN1cHBsZW1lbnRzKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlZ2lzdGVyZWQgUmVhZGVyczogXCIgKyBfYmFyY29kZVJlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocmVhZGVyKSA9PiBKU09OLnN0cmluZ2lmeSh7Zm9ybWF0OiByZWFkZXIuRk9STUFULCBjb25maWc6IHJlYWRlci5jb25maWd9KSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdENvbmZpZygpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgICAgICB2aXMgPSBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogX2NhbnZhcy5kb20uZnJlcXVlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogY29uZmlnLmRlYnVnLnNob3dGcmVxdWVuY3lcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogX2NhbnZhcy5kb20ucGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IGNvbmZpZy5kZWJ1Zy5zaG93UGF0dGVyblxuICAgICAgICAgICAgICAgICAgICB9XTtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpc1tpXS5wcm9wID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNbaV0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzW2ldLm5vZGUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGV4dGVuZCB0aGUgbGluZSBvbiBib3RoIGVuZHNcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbGluZVxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldEV4dGVuZGVkTGluZShsaW5lLCBhbmdsZSwgZXh0KSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBleHRlbmRMaW5lKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHk6IGFtb3VudCAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgeDogYW1vdW50ICogTWF0aC5jb3MoYW5nbGUpXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi55O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaW5zaWRlIGltYWdlXG4gICAgICAgICAgICBleHRlbmRMaW5lKGV4dCk7XG4gICAgICAgICAgICB3aGlsZSAoZXh0ID4gMSAmJiAoIWlucHV0SW1hZ2VXcmFwcGVyLmluSW1hZ2VXaXRoQm9yZGVyKGxpbmVbMF0sIDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICFpbnB1dEltYWdlV3JhcHBlci5pbkltYWdlV2l0aEJvcmRlcihsaW5lWzFdLCAwKSkpIHtcbiAgICAgICAgICAgICAgICBleHQgLT0gTWF0aC5jZWlsKGV4dCAvIDIpO1xuICAgICAgICAgICAgICAgIGV4dGVuZExpbmUoLWV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGluZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldExpbmUoYm94KSB7XG4gICAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgICAgICB4OiAoYm94WzFdWzBdIC0gYm94WzBdWzBdKSAvIDIgKyBib3hbMF1bMF0sXG4gICAgICAgICAgICAgICAgeTogKGJveFsxXVsxXSAtIGJveFswXVsxXSkgLyAyICsgYm94WzBdWzFdXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogKGJveFszXVswXSAtIGJveFsyXVswXSkgLyAyICsgYm94WzJdWzBdLFxuICAgICAgICAgICAgICAgIHk6IChib3hbM11bMV0gLSBib3hbMl1bMV0pIC8gMiArIGJveFsyXVsxXVxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0cnlEZWNvZGUobGluZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGwsXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBiYXJjb2RlTGluZSA9IEJyZXNlbmhhbS5nZXRCYXJjb2RlTGluZShpbnB1dEltYWdlV3JhcHBlciwgbGluZVswXSwgbGluZVsxXSk7XG5cbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnLnNob3dGcmVxdWVuY3kpIHtcbiAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGxpbmUsIHt4OiAneCcsIHk6ICd5J30sIF9jYW52YXMuY3R4Lm92ZXJsYXksIHtjb2xvcjogJ3JlZCcsIGxpbmVXaWR0aDogM30pO1xuICAgICAgICAgICAgICAgIEJyZXNlbmhhbS5kZWJ1Zy5wcmludEZyZXF1ZW5jeShiYXJjb2RlTGluZS5saW5lLCBfY2FudmFzLmRvbS5mcmVxdWVuY3kpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCcmVzZW5oYW0udG9CaW5hcnlMaW5lKGJhcmNvZGVMaW5lKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBCcmVzZW5oYW0uZGVidWcucHJpbnRQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUsIF9jYW52YXMuZG9tLnBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9iYXJjb2RlUmVhZGVycy5sZW5ndGggJiYgcmVzdWx0ID09PSBudWxsOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBfYmFyY29kZVJlYWRlcnNbaV0uZGVjb2RlUGF0dGVybihiYXJjb2RlTGluZS5saW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICAgICAgYmFyY29kZUxpbmU6IGJhcmNvZGVMaW5lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHNsaWNlcyB0aGUgZ2l2ZW4gYXJlYSBhcGFydCBhbmQgdHJpZXMgdG8gZGV0ZWN0IGEgYmFyY29kZS1wYXR0ZXJuXG4gICAgICAgICAqIGZvciBlYWNoIHNsaWNlLiBJdCByZXR1cm5zIHRoZSBkZWNvZGVkIGJhcmNvZGUsIG9yIG51bGwgaWYgbm90aGluZyB3YXMgZm91bmRcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYm94XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVBbmdsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gdHJ5RGVjb2RlQnJ1dGVGb3JjZShib3gsIGxpbmUsIGxpbmVBbmdsZSkge1xuICAgICAgICAgICAgdmFyIHNpZGVMZW5ndGggPSBNYXRoLnNxcnQoTWF0aC5wb3coYm94WzFdWzBdIC0gYm94WzBdWzBdLCAyKSArIE1hdGgucG93KChib3hbMV1bMV0gLSBib3hbMF1bMV0pLCAyKSksXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBzbGljZXMgPSAxNixcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsLFxuICAgICAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICAgICAgICAgeGRpciA9IE1hdGguc2luKGxpbmVBbmdsZSksXG4gICAgICAgICAgICAgICAgeWRpciA9IE1hdGguY29zKGxpbmVBbmdsZSk7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAxOyBpIDwgc2xpY2VzICYmIHJlc3VsdCA9PT0gbnVsbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gbW92ZSBsaW5lIHBlcnBlbmRpY3VsYXIgdG8gYW5nbGVcbiAgICAgICAgICAgICAgICBkaXIgPSBzaWRlTGVuZ3RoIC8gc2xpY2VzICogaSAqIChpICUgMiA9PT0gMCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0ge1xuICAgICAgICAgICAgICAgICAgICB5OiBkaXIgKiB4ZGlyLFxuICAgICAgICAgICAgICAgICAgICB4OiBkaXIgKiB5ZGlyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnkgKz0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICAgICAgbGluZVswXS54IC09IGV4dGVuc2lvbi55O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueSArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICBsaW5lWzFdLnggLT0gZXh0ZW5zaW9uLnk7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KFxuICAgICAgICAgICAgICAgIE1hdGgucG93KE1hdGguYWJzKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSksIDIpICtcbiAgICAgICAgICAgICAgICBNYXRoLnBvdyhNYXRoLmFicyhsaW5lWzFdLnggLSBsaW5lWzBdLngpLCAyKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogV2l0aCB0aGUgaGVscCBvZiB0aGUgY29uZmlndXJlZCByZWFkZXJzIChDb2RlMTI4IG9yIEVBTikgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBkZXRlY3QgYVxuICAgICAgICAgKiB2YWxpZCBiYXJjb2RlIHBhdHRlcm4gd2l0aGluIHRoZSBnaXZlbiBhcmVhLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYm94IFRoZSBhcmVhIHRvIHNlYXJjaCBpblxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgcmVzdWx0IHtjb2RlUmVzdWx0LCBsaW5lLCBhbmdsZSwgcGF0dGVybiwgdGhyZXNob2xkfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkge1xuICAgICAgICAgICAgdmFyIGxpbmUsXG4gICAgICAgICAgICAgICAgbGluZUFuZ2xlLFxuICAgICAgICAgICAgICAgIGN0eCA9IF9jYW52YXMuY3R4Lm92ZXJsYXksXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIGxpbmVMZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRlYnVnLmRyYXdCb3VuZGluZ0JveCAmJiBjdHgpIHtcbiAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChib3gsIHt4OiAwLCB5OiAxfSwgY3R4LCB7Y29sb3I6IFwiYmx1ZVwiLCBsaW5lV2lkdGg6IDJ9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKGJveCk7XG4gICAgICAgICAgICBsaW5lTGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcbiAgICAgICAgICAgIGxpbmVBbmdsZSA9IE1hdGguYXRhbjIobGluZVsxXS55IC0gbGluZVswXS55LCBsaW5lWzFdLnggLSBsaW5lWzBdLngpO1xuICAgICAgICAgICAgbGluZSA9IGdldEV4dGVuZGVkTGluZShsaW5lLCBsaW5lQW5nbGUsIE1hdGguZmxvb3IobGluZUxlbmd0aCAqIDAuMSkpO1xuICAgICAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ5RGVjb2RlQnJ1dGVGb3JjZShib3gsIGxpbmUsIGxpbmVBbmdsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiByZXN1bHQgJiYgY29uZmlnLmRlYnVnLmRyYXdTY2FubGluZSAmJiBjdHgpIHtcbiAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGxpbmUsIHt4OiAneCcsIHk6ICd5J30sIGN0eCwge2NvbG9yOiAncmVkJywgbGluZVdpZHRoOiAzfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZVJlc3VsdDogcmVzdWx0LmNvZGVSZXN1bHQsXG4gICAgICAgICAgICAgICAgbGluZTogbGluZSxcbiAgICAgICAgICAgICAgICBhbmdsZTogbGluZUFuZ2xlLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHJlc3VsdC5iYXJjb2RlTGluZS5saW5lLFxuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcmVzdWx0LmJhcmNvZGVMaW5lLnRocmVzaG9sZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3g6IGZ1bmN0aW9uKGJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3hlczogZnVuY3Rpb24oYm94ZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBiYXJjb2RlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZTtcblxuICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm94ID0gYm94ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY29kZUZyb21Cb3VuZGluZ0JveChib3gpIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm94ID0gYm94O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZXMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJjb2Rlc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRSZWFkZXJzOiBmdW5jdGlvbihyZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnJlYWRlcnMgPSByZWFkZXJzO1xuICAgICAgICAgICAgICAgIF9iYXJjb2RlUmVhZGVycy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGluaXRSZWFkZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kZWNvZGVyL2JhcmNvZGVfZGVjb2Rlci5qcyIsImltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi4vY29tbW9uL2ltYWdlX3dyYXBwZXInO1xuXG52YXIgQnJlc2VuaGFtID0ge307XG5cbnZhciBTbG9wZSA9IHtcbiAgICBESVI6IHtcbiAgICAgICAgVVA6IDEsXG4gICAgICAgIERPV046IC0xXG4gICAgfVxufTtcbi8qKlxuICogU2NhbnMgYSBsaW5lIG9mIHRoZSBnaXZlbiBpbWFnZSBmcm9tIHBvaW50IHAxIHRvIHAyIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBjb250YWluaW5nXG4gKiBncmF5LXNjYWxlIHZhbHVlcyAoMC0yNTUpIG9mIHRoZSB1bmRlcmx5aW5nIHBpeGVscyBpbiBhZGRpdGlvbiB0byB0aGUgbWluXG4gKiBhbmQgbWF4IHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZVdyYXBwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSBUaGUgc3RhcnQgcG9pbnQge3gseX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiBUaGUgZW5kIHBvaW50IHt4LHl9XG4gKiBAcmV0dXJucyB7bGluZSwgbWluLCBtYXh9XG4gKi9cbkJyZXNlbmhhbS5nZXRCYXJjb2RlTGluZSA9IGZ1bmN0aW9uKGltYWdlV3JhcHBlciwgcDEsIHAyKSB7XG4gICAgdmFyIHgwID0gcDEueCB8IDAsXG4gICAgICAgIHkwID0gcDEueSB8IDAsXG4gICAgICAgIHgxID0gcDIueCB8IDAsXG4gICAgICAgIHkxID0gcDIueSB8IDAsXG4gICAgICAgIHN0ZWVwID0gTWF0aC5hYnMoeTEgLSB5MCkgPiBNYXRoLmFicyh4MSAtIHgwKSxcbiAgICAgICAgZGVsdGF4LFxuICAgICAgICBkZWx0YXksXG4gICAgICAgIGVycm9yLFxuICAgICAgICB5c3RlcCxcbiAgICAgICAgeSxcbiAgICAgICAgdG1wLFxuICAgICAgICB4LFxuICAgICAgICBsaW5lID0gW10sXG4gICAgICAgIGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhLFxuICAgICAgICB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLngsXG4gICAgICAgIHN1bSA9IDAsXG4gICAgICAgIHZhbCxcbiAgICAgICAgbWluID0gMjU1LFxuICAgICAgICBtYXggPSAwO1xuXG4gICAgZnVuY3Rpb24gcmVhZChhLCBiKSB7XG4gICAgICAgIHZhbCA9IGltYWdlRGF0YVtiICogd2lkdGggKyBhXTtcbiAgICAgICAgc3VtICs9IHZhbDtcbiAgICAgICAgbWluID0gdmFsIDwgbWluID8gdmFsIDogbWluO1xuICAgICAgICBtYXggPSB2YWwgPiBtYXggPyB2YWwgOiBtYXg7XG4gICAgICAgIGxpbmUucHVzaCh2YWwpO1xuICAgIH1cblxuICAgIGlmIChzdGVlcCkge1xuICAgICAgICB0bXAgPSB4MDtcbiAgICAgICAgeDAgPSB5MDtcbiAgICAgICAgeTAgPSB0bXA7XG5cbiAgICAgICAgdG1wID0geDE7XG4gICAgICAgIHgxID0geTE7XG4gICAgICAgIHkxID0gdG1wO1xuICAgIH1cbiAgICBpZiAoeDAgPiB4MSkge1xuICAgICAgICB0bXAgPSB4MDtcbiAgICAgICAgeDAgPSB4MTtcbiAgICAgICAgeDEgPSB0bXA7XG5cbiAgICAgICAgdG1wID0geTA7XG4gICAgICAgIHkwID0geTE7XG4gICAgICAgIHkxID0gdG1wO1xuICAgIH1cbiAgICBkZWx0YXggPSB4MSAtIHgwO1xuICAgIGRlbHRheSA9IE1hdGguYWJzKHkxIC0geTApO1xuICAgIGVycm9yID0gKGRlbHRheCAvIDIpIHwgMDtcbiAgICB5ID0geTA7XG4gICAgeXN0ZXAgPSB5MCA8IHkxID8gMSA6IC0xO1xuICAgIGZvciAoIHggPSB4MDsgeCA8IHgxOyB4KyspIHtcbiAgICAgICAgaWYgKHN0ZWVwKXtcbiAgICAgICAgICAgIHJlYWQoeSwgeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWFkKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yID0gZXJyb3IgLSBkZWx0YXk7XG4gICAgICAgIGlmIChlcnJvciA8IDApIHtcbiAgICAgICAgICAgIHkgPSB5ICsgeXN0ZXA7XG4gICAgICAgICAgICBlcnJvciA9IGVycm9yICsgZGVsdGF4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbGluZSxcbiAgICAgICAgbWluOiBtaW4sXG4gICAgICAgIG1heDogbWF4XG4gICAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHJlc3VsdCBmcm9tIGdldEJhcmNvZGVMaW5lIGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAqIGFsc28gY29uc2lkZXJpbmcgdGhlIGZyZXF1ZW5jeSBhbmQgc2xvcGUgb2YgdGhlIHNpZ25hbCBmb3IgbW9yZSByb2J1c3QgcmVzdWx0c1xuICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCB7bGluZSwgbWluLCBtYXh9XG4gKi9cbkJyZXNlbmhhbS50b0JpbmFyeUxpbmUgPSBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICB2YXIgbWluID0gcmVzdWx0Lm1pbixcbiAgICAgICAgbWF4ID0gcmVzdWx0Lm1heCxcbiAgICAgICAgbGluZSA9IHJlc3VsdC5saW5lLFxuICAgICAgICBzbG9wZSxcbiAgICAgICAgc2xvcGUyLFxuICAgICAgICBjZW50ZXIgPSBtaW4gKyAobWF4IC0gbWluKSAvIDIsXG4gICAgICAgIGV4dHJlbWEgPSBbXSxcbiAgICAgICAgY3VycmVudERpcixcbiAgICAgICAgZGlyLFxuICAgICAgICB0aHJlc2hvbGQgPSAobWF4IC0gbWluKSAvIDEyLFxuICAgICAgICByVGhyZXNob2xkID0gLXRocmVzaG9sZCxcbiAgICAgICAgaSxcbiAgICAgICAgajtcblxuICAgIC8vIDEuIGZpbmQgZXh0cmVtYVxuICAgIGN1cnJlbnREaXIgPSBsaW5lWzBdID4gY2VudGVyID8gU2xvcGUuRElSLlVQIDogU2xvcGUuRElSLkRPV047XG4gICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgcG9zOiAwLFxuICAgICAgICB2YWw6IGxpbmVbMF1cbiAgICB9KTtcbiAgICBmb3IgKCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgIHNsb3BlID0gKGxpbmVbaSArIDFdIC0gbGluZVtpXSk7XG4gICAgICAgIHNsb3BlMiA9IChsaW5lW2kgKyAyXSAtIGxpbmVbaSArIDFdKTtcbiAgICAgICAgaWYgKChzbG9wZSArIHNsb3BlMikgPCByVGhyZXNob2xkICYmIGxpbmVbaSArIDFdIDwgKGNlbnRlciAqIDEuNSkpIHtcbiAgICAgICAgICAgIGRpciA9IFNsb3BlLkRJUi5ET1dOO1xuICAgICAgICB9IGVsc2UgaWYgKChzbG9wZSArIHNsb3BlMikgPiB0aHJlc2hvbGQgJiYgbGluZVtpICsgMV0gPiAoY2VudGVyICogMC41KSkge1xuICAgICAgICAgICAgZGlyID0gU2xvcGUuRElSLlVQO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlyID0gY3VycmVudERpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50RGlyICE9PSBkaXIpIHtcbiAgICAgICAgICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgICAgICAgICAgcG9zOiBpLFxuICAgICAgICAgICAgICAgIHZhbDogbGluZVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjdXJyZW50RGlyID0gZGlyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgIHBvczogbGluZS5sZW5ndGgsXG4gICAgICAgIHZhbDogbGluZVtsaW5lLmxlbmd0aCAtIDFdXG4gICAgfSk7XG5cbiAgICBmb3IgKCBqID0gZXh0cmVtYVswXS5wb3M7IGogPCBleHRyZW1hWzFdLnBvczsgaisrKSB7XG4gICAgICAgIGxpbmVbal0gPSBsaW5lW2pdID4gY2VudGVyID8gMCA6IDE7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGV4dHJlbWEgYW5kIGNvbnZlcnQgdG8gYmluYXJ5IGJhc2VkIG9uIGF2ZyBiZXR3ZWVuIG1pbm1heFxuICAgIGZvciAoIGkgPSAxOyBpIDwgZXh0cmVtYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKGV4dHJlbWFbaSArIDFdLnZhbCA+IGV4dHJlbWFbaV0udmFsKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGQgPSAoZXh0cmVtYVtpXS52YWwgKyAoKGV4dHJlbWFbaSArIDFdLnZhbCAtIGV4dHJlbWFbaV0udmFsKSAvIDMpICogMikgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaSArIDFdLnZhbCArICgoZXh0cmVtYVtpXS52YWwgLSBleHRyZW1hW2kgKyAxXS52YWwpIC8gMykpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIGogPSBleHRyZW1hW2ldLnBvczsgaiA8IGV4dHJlbWFbaSArIDFdLnBvczsgaisrKSB7XG4gICAgICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IHRocmVzaG9sZCA/IDAgOiAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbGluZSxcbiAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGRcbiAgICB9O1xufTtcblxuLyoqXG4gKiBVc2VkIGZvciBkZXZlbG9wbWVudCBvbmx5XG4gKi9cbkJyZXNlbmhhbS5kZWJ1ZyA9IHtcbiAgICBwcmludEZyZXF1ZW5jeTogZnVuY3Rpb24obGluZSwgY2FudmFzKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gbGluZS5sZW5ndGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAyNTY7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImJsdWVcIjtcbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKGksIDI1NSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKGksIDI1NSAtIGxpbmVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIH0sXG5cbiAgICBwcmludFBhdHRlcm46IGZ1bmN0aW9uKGxpbmUsIGNhbnZhcykge1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSwgaTtcblxuICAgICAgICBjYW52YXMud2lkdGggPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgY3R4LmZpbGxDb2xvciA9IFwiYmxhY2tcIjtcbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGluZVtpXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChpLCAwLCAxLCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQnJlc2VuaGFtO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RlY29kZXIvYnJlc2VuaGFtLmpzIiwiaW1wb3J0IHtvbWl0LCBwaWNrfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtnZXRVc2VyTWVkaWEsIGVudW1lcmF0ZURldmljZXN9IGZyb20gJ21lZGlhRGV2aWNlcyc7XG5cbmNvbnN0IGZhY2luZ01hdGNoaW5nID0ge1xuICAgIFwidXNlclwiOiAvZnJvbnQvaSxcbiAgICBcImVudmlyb25tZW50XCI6IC9iYWNrL2lcbn07XG5cbnZhciBzdHJlYW1SZWY7XG5cbmZ1bmN0aW9uIHdhaXRGb3JWaWRlbyh2aWRlbykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDEwO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVmlkZW8oKSB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvLnZpZGVvV2lkdGggPiAxMCAmJiB2aWRlby52aWRlb0hlaWdodCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZpZGVvLnZpZGVvV2lkdGggKyBcInB4IHggXCIgKyB2aWRlby52aWRlb0hlaWdodCArIFwicHhcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrVmlkZW8sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QoJ1VuYWJsZSB0byBwbGF5IHZpZGVvIHN0cmVhbS4gSXMgd2ViY2FtIHdvcmtpbmc/Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRlbXB0cy0tO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrVmlkZW8oKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmllcyB0byBhdHRhY2ggdGhlIGNhbWVyYS1zdHJlYW0gdG8gYSBnaXZlbiB2aWRlby1lbGVtZW50XG4gKiBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIGNvbnRlbnQgaXMgcmVhZHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25zdHJhaW50c1xuICogQHBhcmFtIHtPYmplY3R9IHZpZGVvXG4gKi9cbmZ1bmN0aW9uIGluaXRDYW1lcmEodmlkZW8sIGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIGdldFVzZXJNZWRpYShjb25zdHJhaW50cylcbiAgICAudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVmID0gc3RyZWFtO1xuICAgICAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKFwiYXV0b3BsYXlcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ211dGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWRlby5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4od2FpdEZvclZpZGVvLmJpbmQobnVsbCwgdmlkZW8pKTtcbn1cblxuZnVuY3Rpb24gZGVwcmVjYXRlZENvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gcGljayh2aWRlb0NvbnN0cmFpbnRzLCBbXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcImZhY2luZ01vZGVcIixcbiAgICAgICAgICAgIFwiYXNwZWN0UmF0aW9cIiwgXCJkZXZpY2VJZFwiXSk7XG5cbiAgICBpZiAodHlwZW9mIHZpZGVvQ29uc3RyYWludHMubWluQXNwZWN0UmF0aW8gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB2aWRlb0NvbnN0cmFpbnRzLm1pbkFzcGVjdFJhdGlvID4gMCkge1xuICAgICAgICBub3JtYWxpemVkLmFzcGVjdFJhdGlvID0gdmlkZW9Db25zdHJhaW50cy5taW5Bc3BlY3RSYXRpbztcbiAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBDb25zdHJhaW50ICdtaW5Bc3BlY3RSYXRpbycgaXMgZGVwcmVjYXRlZDsgVXNlICdhc3BlY3RSYXRpbycgaW5zdGVhZFwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2aWRlb0NvbnN0cmFpbnRzLmZhY2luZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5mYWNpbmdNb2RlID0gdmlkZW9Db25zdHJhaW50cy5mYWNpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTklORzogQ29uc3RyYWludCAnZmFjaW5nJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2ZhY2luZ01vZGUnIGluc3RlYWQnXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2tDb25zdHJhaW50cyh2aWRlb0NvbnN0cmFpbnRzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbnN0cmFpbnRzID0ge1xuICAgICAgICBhdWRpbzogZmFsc2UsXG4gICAgICAgIHZpZGVvOiBkZXByZWNhdGVkQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50cylcbiAgICB9O1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRDb25zdHJhaW50cy52aWRlby5kZXZpY2VJZFxuICAgICAgICAgICAgJiYgbm9ybWFsaXplZENvbnN0cmFpbnRzLnZpZGVvLmZhY2luZ01vZGUpIHtcbiAgICAgICAgZGVsZXRlIG5vcm1hbGl6ZWRDb25zdHJhaW50cy52aWRlby5mYWNpbmdNb2RlO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vcm1hbGl6ZWRDb25zdHJhaW50cyk7XG59XG5cbmZ1bmN0aW9uIGVudW1lcmF0ZVZpZGVvRGV2aWNlcygpIHtcbiAgICByZXR1cm4gZW51bWVyYXRlRGV2aWNlcygpXG4gICAgLnRoZW4oZGV2aWNlcyA9PiBkZXZpY2VzLmZpbHRlcihkZXZpY2UgPT4gZGV2aWNlLmtpbmQgPT09ICd2aWRlb2lucHV0JykpO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVUcmFjaygpIHtcbiAgICBpZiAoc3RyZWFtUmVmKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrcyA9IHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFja3NbMF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICByZXF1ZXN0OiBmdW5jdGlvbih2aWRlbywgdmlkZW9Db25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gcGlja0NvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpXG4gICAgICAgICAgICAudGhlbihpbml0Q2FtZXJhLmJpbmQobnVsbCwgdmlkZW8pKTtcbiAgICB9LFxuICAgIHJlbGVhc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdHJhY2tzID0gc3RyZWFtUmVmICYmIHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyYWNrc1swXS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtUmVmID0gbnVsbDtcbiAgICB9LFxuICAgIGVudW1lcmF0ZVZpZGVvRGV2aWNlcyxcbiAgICBnZXRBY3RpdmVTdHJlYW1MYWJlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gZ2V0QWN0aXZlVHJhY2soKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrID8gdHJhY2subGFiZWwgOiAnJztcbiAgICB9LFxuICAgIGdldEFjdGl2ZVRyYWNrXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2lucHV0L2NhbWVyYV9hY2Nlc3MuanMiLCIvLyBTY3JhcGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2V4aWYtanMvZXhpZi1qc1xuXG5jb25zdCBFeGlmVGFncyA9IHsweDAxMTI6IFwib3JpZW50YXRpb25cIn07XG5leHBvcnQgY29uc3QgQXZhaWxhYmxlVGFncyA9IE9iamVjdC5rZXlzKEV4aWZUYWdzKS5tYXAoa2V5ID0+IEV4aWZUYWdzW2tleV0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ3NJbk9iamVjdFVSTChzcmMsIHRhZ3MgPSBBdmFpbGFibGVUYWdzKSB7XG4gICAgaWYgKC9eYmxvYlxcOi9pLnRlc3Qoc3JjKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0VVJMVG9CbG9iKHNyYylcbiAgICAgICAgICAgIC50aGVuKHJlYWRUb0J1ZmZlcilcbiAgICAgICAgICAgIC50aGVuKGJ1ZmZlciA9PiBmaW5kVGFnc0luQnVmZmVyKGJ1ZmZlciwgdGFncykpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihkYXRhVXJsKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gZGF0YVVybC5yZXBsYWNlKC9eZGF0YVxcOihbXlxcO10rKVxcO2Jhc2U2NCwvZ21pLCAnJyksXG4gICAgICAgIGJpbmFyeSA9IGF0b2IoYmFzZTY0KSxcbiAgICAgICAgbGVuID0gYmluYXJ5Lmxlbmd0aCxcbiAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGxlbiksXG4gICAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2aWV3W2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJlYWRUb0J1ZmZlcihibG9iKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvYmplY3RVUkxUb0Jsb2IodXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oXCJHRVRcIiwgdXJsLCB0cnVlKTtcbiAgICAgICAgaHR0cC5yZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcbiAgICAgICAgaHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaHR0cC5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIChodHRwLnN0YXR1cyA9PT0gMjAwIHx8IGh0dHAuc3RhdHVzID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGh0dHAub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGFnc0luQnVmZmVyKGZpbGUsIHNlbGVjdGVkVGFncyA9IEF2YWlsYWJsZVRhZ3MpIHtcbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhmaWxlKSxcbiAgICAgICAgbGVuZ3RoID0gZmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBleGlmVGFncyA9IHNlbGVjdGVkVGFncy5yZWR1Y2UoKHJlc3VsdCwgc2VsZWN0ZWRUYWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aWZUYWcgPSBPYmplY3Qua2V5cyhFeGlmVGFncykuZmlsdGVyKHRhZyA9PiBFeGlmVGFnc1t0YWddID09PSBzZWxlY3RlZFRhZylbMF07XG4gICAgICAgICAgICBpZiAoZXhpZlRhZykge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtleGlmVGFnXSA9IHNlbGVjdGVkVGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuICAgIGxldCBvZmZzZXQgPSAyLFxuICAgICAgICBtYXJrZXI7XG5cbiAgICBpZiAoKGRhdGFWaWV3LmdldFVpbnQ4KDApICE9PSAweEZGKSB8fCAoZGF0YVZpZXcuZ2V0VWludDgoMSkgIT09IDB4RDgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmIChkYXRhVmlldy5nZXRVaW50OChvZmZzZXQpICE9PSAweEZGKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrZXIgPSBkYXRhVmlldy5nZXRVaW50OChvZmZzZXQgKyAxKTtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhFMSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRFWElGRGF0YShkYXRhVmlldywgb2Zmc2V0ICsgNCwgZXhpZlRhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDIgKyBkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRFWElGRGF0YShmaWxlLCBzdGFydCwgZXhpZlRhZ3MpIHtcbiAgICBpZiAoZ2V0U3RyaW5nRnJvbUJ1ZmZlcihmaWxlLCBzdGFydCwgNCkgIT09IFwiRXhpZlwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWZmT2Zmc2V0ID0gc3RhcnQgKyA2O1xuICAgIGxldCBiaWdFbmQsXG4gICAgICAgIHRhZ3M7XG5cbiAgICBpZiAoZmlsZS5nZXRVaW50MTYodGlmZk9mZnNldCkgPT09IDB4NDk0OSkge1xuICAgICAgICBiaWdFbmQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGZpbGUuZ2V0VWludDE2KHRpZmZPZmZzZXQpID09PSAweDRENEQpIHtcbiAgICAgICAgYmlnRW5kID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZ2V0VWludDE2KHRpZmZPZmZzZXQgKyAyLCAhYmlnRW5kKSAhPT0gMHgwMDJBKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdElGRE9mZnNldCA9IGZpbGUuZ2V0VWludDMyKHRpZmZPZmZzZXQgKyA0LCAhYmlnRW5kKTtcbiAgICBpZiAoZmlyc3RJRkRPZmZzZXQgPCAweDAwMDAwMDA4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0YWdzID0gcmVhZFRhZ3MoZmlsZSwgdGlmZk9mZnNldCwgdGlmZk9mZnNldCArIGZpcnN0SUZET2Zmc2V0LCBleGlmVGFncywgYmlnRW5kKTtcbiAgICByZXR1cm4gdGFncztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ3MoZmlsZSwgdGlmZlN0YXJ0LCBkaXJTdGFydCwgc3RyaW5ncywgYmlnRW5kKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZpbGUuZ2V0VWludDE2KGRpclN0YXJ0LCAhYmlnRW5kKSxcbiAgICAgICAgdGFncyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZW50cnlPZmZzZXQgPSBkaXJTdGFydCArIGkgKiAxMiArIDIsXG4gICAgICAgICAgICB0YWcgPSBzdHJpbmdzW2ZpbGUuZ2V0VWludDE2KGVudHJ5T2Zmc2V0LCAhYmlnRW5kKV07XG4gICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgIHRhZ3NbdGFnXSA9IHJlYWRUYWdWYWx1ZShmaWxlLCBlbnRyeU9mZnNldCwgdGlmZlN0YXJ0LCBkaXJTdGFydCwgYmlnRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFncztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1ZhbHVlKGZpbGUsIGVudHJ5T2Zmc2V0LCB0aWZmU3RhcnQsIGRpclN0YXJ0LCBiaWdFbmQpIHtcbiAgICBjb25zdCB0eXBlID0gZmlsZS5nZXRVaW50MTYoZW50cnlPZmZzZXQgKyAyLCAhYmlnRW5kKSxcbiAgICAgICAgbnVtVmFsdWVzID0gZmlsZS5nZXRVaW50MzIoZW50cnlPZmZzZXQgKyA0LCAhYmlnRW5kKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKG51bVZhbHVlcyA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgOCwgIWJpZ0VuZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0Zyb21CdWZmZXIoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgbGV0IG91dHN0ciA9IFwiXCI7XG4gICAgZm9yIChsZXQgbiA9IHN0YXJ0OyBuIDwgc3RhcnQgKyBsZW5ndGg7IG4rKykge1xuICAgICAgICBvdXRzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZmZXIuZ2V0VWludDgobikpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0c3RyO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2lucHV0L2V4aWZfaGVscGVyLmpzIiwiaW1wb3J0IHtcbiAgICBpbWFnZVJlZixcbiAgICBncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhLFxuICAgIGNvbXB1dGVHcmF5XG59IGZyb20gJy4uL2NvbW1vbi9jdl91dGlscyc7XG5cbmNvbnN0IFRPX1JBRElBTlMgPSBNYXRoLlBJIC8gMTgwO1xuXG5mdW5jdGlvbiBhZGp1c3RDYW52YXNTaXplKGNhbnZhcywgdGFyZ2V0U2l6ZSkge1xuICAgIGlmIChjYW52YXMud2lkdGggIT09IHRhcmdldFNpemUueCkge1xuICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIldBUk5JTkc6IGNhbnZhcy1zaXplIG5lZWRzIHRvIGJlIGFkanVzdGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRhcmdldFNpemUueDtcbiAgICB9XG4gICAgaWYgKGNhbnZhcy5oZWlnaHQgIT09IHRhcmdldFNpemUueSkge1xuICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIldBUk5JTkc6IGNhbnZhcy1zaXplIG5lZWRzIHRvIGJlIGFkanVzdGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0YXJnZXRTaXplLnk7XG4gICAgfVxufVxuXG52YXIgRnJhbWVHcmFiYmVyID0ge307XG5cbkZyYW1lR3JhYmJlci5jcmVhdGUgPSBmdW5jdGlvbihpbnB1dFN0cmVhbSwgY2FudmFzKSB7XG4gICAgdmFyIF90aGF0ID0ge30sXG4gICAgICAgIF9zdHJlYW1Db25maWcgPSBpbnB1dFN0cmVhbS5nZXRDb25maWcoKSxcbiAgICAgICAgX3ZpZGVvX3NpemUgPSBpbWFnZVJlZihpbnB1dFN0cmVhbS5nZXRSZWFsV2lkdGgoKSwgaW5wdXRTdHJlYW0uZ2V0UmVhbEhlaWdodCgpKSxcbiAgICAgICAgX2NhbnZhc1NpemUgPSBpbnB1dFN0cmVhbS5nZXRDYW52YXNTaXplKCksXG4gICAgICAgIF9zaXplID0gaW1hZ2VSZWYoaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSwgaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCkpLFxuICAgICAgICB0b3BSaWdodCA9IGlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCksXG4gICAgICAgIF9zeCA9IHRvcFJpZ2h0LngsXG4gICAgICAgIF9zeSA9IHRvcFJpZ2h0LnksXG4gICAgICAgIF9jYW52YXMsXG4gICAgICAgIF9jdHggPSBudWxsLFxuICAgICAgICBfZGF0YSA9IG51bGw7XG5cbiAgICBfY2FudmFzID0gY2FudmFzID8gY2FudmFzIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBfY2FudmFzLndpZHRoID0gX2NhbnZhc1NpemUueDtcbiAgICBfY2FudmFzLmhlaWdodCA9IF9jYW52YXNTaXplLnk7XG4gICAgX2N0eCA9IF9jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIF9kYXRhID0gbmV3IFVpbnQ4QXJyYXkoX3NpemUueCAqIF9zaXplLnkpO1xuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGcmFtZUdyYWJiZXJcIiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2l6ZTogX3NpemUsXG4gICAgICAgICAgICB0b3BSaWdodDogdG9wUmlnaHQsXG4gICAgICAgICAgICB2aWRlb1NpemU6IF92aWRlb19zaXplLFxuICAgICAgICAgICAgY2FudmFzU2l6ZTogX2NhbnZhc1NpemVcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgdGhlIGdpdmVuIGFycmF5IGFzIGZyYW1lLWJ1ZmZlclxuICAgICAqL1xuICAgIF90aGF0LmF0dGFjaERhdGEgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIF9kYXRhID0gZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlZCBmcmFtZS1idWZmZXJcbiAgICAgKi9cbiAgICBfdGhhdC5nZXREYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhIGZyYW1lIGZyb20gdGhlIGlucHV0LXN0cmVhbSBhbmQgcHV0cyBpbnRvIHRoZSBmcmFtZS1idWZmZXIuXG4gICAgICogVGhlIGltYWdlLWRhdGEgaXMgY29udmVydGVkIHRvIGdyYXktc2NhbGUgYW5kIHRoZW4gaGFsZi1zYW1wbGVkIGlmIGNvbmZpZ3VyZWQuXG4gICAgICovXG4gICAgX3RoYXQuZ3JhYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZG9IYWxmU2FtcGxlID0gX3N0cmVhbUNvbmZpZy5oYWxmU2FtcGxlLFxuICAgICAgICAgICAgZnJhbWUgPSBpbnB1dFN0cmVhbS5nZXRGcmFtZSgpLFxuICAgICAgICAgICAgZHJhd2FibGUgPSBmcmFtZSxcbiAgICAgICAgICAgIGRyYXdBbmdsZSA9IDAsXG4gICAgICAgICAgICBjdHhEYXRhO1xuICAgICAgICBpZiAoZHJhd2FibGUpIHtcbiAgICAgICAgICAgIGFkanVzdENhbnZhc1NpemUoX2NhbnZhcywgX2NhbnZhc1NpemUpO1xuICAgICAgICAgICAgaWYgKF9zdHJlYW1Db25maWcudHlwZSA9PT0gJ0ltYWdlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgIGRyYXdhYmxlID0gZnJhbWUuaW1nO1xuICAgICAgICAgICAgICAgIGlmIChmcmFtZS50YWdzICYmIGZyYW1lLnRhZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmcmFtZS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdBbmdsZSA9IDkwICogVE9fUkFESUFOUztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3QW5nbGUgPSAtOTAgKiBUT19SQURJQU5TO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkcmF3QW5nbGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBfY3R4LnRyYW5zbGF0ZShfY2FudmFzU2l6ZS54IC8gMiwgX2NhbnZhc1NpemUueSAvIDIpO1xuICAgICAgICAgICAgICAgIF9jdHgucm90YXRlKGRyYXdBbmdsZSk7XG4gICAgICAgICAgICAgICAgX2N0eC5kcmF3SW1hZ2UoZHJhd2FibGUsIC1fY2FudmFzU2l6ZS55IC8gMiwgLV9jYW52YXNTaXplLnggLyAyLCBfY2FudmFzU2l6ZS55LCBfY2FudmFzU2l6ZS54KTtcbiAgICAgICAgICAgICAgICBfY3R4LnJvdGF0ZSgtZHJhd0FuZ2xlKTtcbiAgICAgICAgICAgICAgICBfY3R4LnRyYW5zbGF0ZSgtX2NhbnZhc1NpemUueCAvIDIsIC1fY2FudmFzU2l6ZS55IC8gMik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9jdHguZHJhd0ltYWdlKGRyYXdhYmxlLCAwLCAwLCBfY2FudmFzU2l6ZS54LCBfY2FudmFzU2l6ZS55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4RGF0YSA9IF9jdHguZ2V0SW1hZ2VEYXRhKF9zeCwgX3N5LCBfc2l6ZS54LCBfc2l6ZS55KS5kYXRhO1xuICAgICAgICAgICAgaWYgKGRvSGFsZlNhbXBsZSl7XG4gICAgICAgICAgICAgICAgZ3JheUFuZEhhbGZTYW1wbGVGcm9tQ2FudmFzRGF0YShjdHhEYXRhLCBfc2l6ZSwgX2RhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlR3JheShjdHhEYXRhLCBfZGF0YSwgX3N0cmVhbUNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhhdC5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfc2l6ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGF0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRnJhbWVHcmFiYmVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2lucHV0L2ZyYW1lX2dyYWJiZXIuanMiLCJpbXBvcnQge2ZpbmRUYWdzSW5PYmplY3RVUkx9IGZyb20gJy4vZXhpZl9oZWxwZXInO1xuXG52YXIgSW1hZ2VMb2FkZXIgPSB7fTtcbkltYWdlTG9hZGVyLmxvYWQgPSBmdW5jdGlvbihkaXJlY3RvcnksIGNhbGxiYWNrLCBvZmZzZXQsIHNpemUsIHNlcXVlbmNlKSB7XG4gICAgdmFyIGh0bWxJbWFnZXNTcmNBcnJheSA9IG5ldyBBcnJheShzaXplKSxcbiAgICAgICAgaHRtbEltYWdlc0FycmF5ID0gbmV3IEFycmF5KGh0bWxJbWFnZXNTcmNBcnJheS5sZW5ndGgpLFxuICAgICAgICBpLFxuICAgICAgICBpbWcsXG4gICAgICAgIG51bTtcblxuICAgIGlmIChzZXF1ZW5jZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaHRtbEltYWdlc1NyY0FycmF5WzBdID0gZGlyZWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBudW0gPSAob2Zmc2V0ICsgaSk7XG4gICAgICAgICAgICBodG1sSW1hZ2VzU3JjQXJyYXlbaV0gPSBkaXJlY3RvcnkgKyBcImltYWdlLVwiICsgKFwiMDBcIiArIG51bSkuc2xpY2UoLTMpICsgXCIuanBnXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaHRtbEltYWdlc0FycmF5Lm5vdExvYWRlZCA9IFtdO1xuICAgIGh0bWxJbWFnZXNBcnJheS5hZGRJbWFnZSA9IGZ1bmN0aW9uKGltYWdlKSB7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5ub3RMb2FkZWQucHVzaChpbWFnZSk7XG4gICAgfTtcbiAgICBodG1sSW1hZ2VzQXJyYXkubG9hZGVkID0gZnVuY3Rpb24obG9hZGVkSW1nKSB7XG4gICAgICAgIHZhciBub3Rsb2FkZWRJbWdzID0gaHRtbEltYWdlc0FycmF5Lm5vdExvYWRlZDtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBub3Rsb2FkZWRJbWdzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZiAobm90bG9hZGVkSW1nc1t4XSA9PT0gbG9hZGVkSW1nKSB7XG4gICAgICAgICAgICAgICAgbm90bG9hZGVkSW1ncy5zcGxpY2UoeCwgMSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBodG1sSW1hZ2VzU3JjQXJyYXkubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltZ05hbWUgPSBodG1sSW1hZ2VzU3JjQXJyYXlbeV0uc3Vic3RyKGh0bWxJbWFnZXNTcmNBcnJheVt5XS5sYXN0SW5kZXhPZihcIi9cIikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkSW1nLnNyYy5sYXN0SW5kZXhPZihpbWdOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxJbWFnZXNBcnJheVt5XSA9IHtpbWc6IGxvYWRlZEltZ307XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90bG9hZGVkSW1ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkltYWdlcyBsb2FkZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VxdWVuY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZmluZFRhZ3NJbk9iamVjdFVSTChkaXJlY3RvcnksIFsnb3JpZW50YXRpb24nXSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4odGFncyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sSW1hZ2VzQXJyYXlbMF0udGFncyA9IHRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGh0bWxJbWFnZXNBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICggaSA9IDA7IGkgPCBodG1sSW1hZ2VzU3JjQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5hZGRJbWFnZShpbWcpO1xuICAgICAgICBhZGRPbmxvYWRIYW5kbGVyKGltZywgaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgaW1nLnNyYyA9IGh0bWxJbWFnZXNTcmNBcnJheVtpXTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBhZGRPbmxvYWRIYW5kbGVyKGltZywgaHRtbEltYWdlc0FycmF5KSB7XG4gICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkubG9hZGVkKHRoaXMpO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IChJbWFnZUxvYWRlcik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaW5wdXQvaW1hZ2VfbG9hZGVyLmpzIiwiaW1wb3J0IEltYWdlTG9hZGVyIGZyb20gJy4vaW1hZ2VfbG9hZGVyJztcblxudmFyIElucHV0U3RyZWFtID0ge307XG5JbnB1dFN0cmVhbS5jcmVhdGVWaWRlb1N0cmVhbSA9IGZ1bmN0aW9uKHZpZGVvKSB7XG4gICAgdmFyIHRoYXQgPSB7fSxcbiAgICAgICAgX2NvbmZpZyA9IG51bGwsXG4gICAgICAgIF9ldmVudE5hbWVzID0gWydjYW5yZWNvcmQnLCAnZW5kZWQnXSxcbiAgICAgICAgX2V2ZW50SGFuZGxlcnMgPSB7fSxcbiAgICAgICAgX2NhbGN1bGF0ZWRXaWR0aCxcbiAgICAgICAgX2NhbGN1bGF0ZWRIZWlnaHQsXG4gICAgICAgIF90b3BSaWdodCA9IHt4OiAwLCB5OiAwfSxcbiAgICAgICAgX2NhbnZhc1NpemUgPSB7eDogMCwgeTogMH07XG5cbiAgICBmdW5jdGlvbiBpbml0U2l6ZSgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gdmlkZW8udmlkZW9XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xuXG4gICAgICAgIF9jYWxjdWxhdGVkV2lkdGggPVxuICAgICAgICAgICAgX2NvbmZpZy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gX2NvbmZpZy5zaXplIDogTWF0aC5mbG9vcigod2lkdGggLyBoZWlnaHQpICogX2NvbmZpZy5zaXplKSA6IHdpZHRoO1xuICAgICAgICBfY2FsY3VsYXRlZEhlaWdodCA9XG4gICAgICAgICAgICBfY29uZmlnLnNpemUgPyB3aWR0aCAvIGhlaWdodCA+IDEgPyBNYXRoLmZsb29yKChoZWlnaHQgLyB3aWR0aCkgKiBfY29uZmlnLnNpemUpIDogX2NvbmZpZy5zaXplIDogaGVpZ2h0O1xuXG4gICAgICAgIF9jYW52YXNTaXplLnggPSBfY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICBfY2FudmFzU2l6ZS55ID0gX2NhbGN1bGF0ZWRIZWlnaHQ7XG4gICAgfVxuXG4gICAgdGhhdC5nZXRSZWFsV2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZpZGVvLnZpZGVvV2lkdGg7XG4gICAgfTtcblxuICAgIHRoYXQuZ2V0UmVhbEhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgfTtcblxuICAgIHRoYXQuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkV2lkdGg7XG4gICAgfTtcblxuICAgIHRoYXQuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfY2FsY3VsYXRlZEhlaWdodDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoKSB7XG4gICAgICAgIF9jYWxjdWxhdGVkV2lkdGggPSB3aWR0aDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHtcbiAgICAgICAgX2NhbGN1bGF0ZWRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgfTtcblxuICAgIHRoYXQuc2V0SW5wdXRTdHJlYW0gPSBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdmlkZW8uc3JjID0gKHR5cGVvZiBjb25maWcuc3JjICE9PSAndW5kZWZpbmVkJykgPyBjb25maWcuc3JjIDogJyc7XG4gICAgfTtcblxuICAgIHRoYXQuZW5kZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZpZGVvLmVuZGVkO1xuICAgIH07XG5cbiAgICB0aGF0LmdldENvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2NvbmZpZztcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICB0aGF0LnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgfTtcblxuICAgIHRoYXQucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgfTtcblxuICAgIHRoYXQuc2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbih0aW1lKSB7XG4gICAgICAgIGlmIChfY29uZmlnLnR5cGUgIT09IFwiTGl2ZVN0cmVhbVwiKSB7XG4gICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRpbWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhhdC5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGYsIGJvb2wpIHtcbiAgICAgICAgaWYgKF9ldmVudE5hbWVzLmluZGV4T2YoZXZlbnQpICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKCFfZXZlbnRIYW5kbGVyc1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9ldmVudEhhbmRsZXJzW2V2ZW50XS5wdXNoKGYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZiwgYm9vbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhhdC5jbGVhckV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgX2V2ZW50TmFtZXMuZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IF9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGF0LnRyaWdnZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIGosXG4gICAgICAgICAgICBoYW5kbGVycyA9IF9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV07XG5cbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NhbnJlY29yZCcpIHtcbiAgICAgICAgICAgIGluaXRTaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgaGFuZGxlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGF0LnNldFRvcFJpZ2h0ID0gZnVuY3Rpb24odG9wUmlnaHQpIHtcbiAgICAgICAgX3RvcFJpZ2h0LnggPSB0b3BSaWdodC54O1xuICAgICAgICBfdG9wUmlnaHQueSA9IHRvcFJpZ2h0Lnk7XG4gICAgfTtcblxuICAgIHRoYXQuZ2V0VG9wUmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF90b3BSaWdodDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRDYW52YXNTaXplID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICBfY2FudmFzU2l6ZS54ID0gc2l6ZS54O1xuICAgICAgICBfY2FudmFzU2l6ZS55ID0gc2l6ZS55O1xuICAgIH07XG5cbiAgICB0aGF0LmdldENhbnZhc1NpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jYW52YXNTaXplO1xuICAgIH07XG5cbiAgICB0aGF0LmdldEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2aWRlbztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoYXQ7XG59O1xuXG5JbnB1dFN0cmVhbS5jcmVhdGVMaXZlU3RyZWFtID0gZnVuY3Rpb24odmlkZW8pIHtcbiAgICB2aWRlby5zZXRBdHRyaWJ1dGUoXCJhdXRvcGxheVwiLCB0cnVlKTtcbiAgICB2YXIgdGhhdCA9IElucHV0U3RyZWFtLmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTtcblxuICAgIHRoYXQuZW5kZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhhdDtcbn07XG5cbklucHV0U3RyZWFtLmNyZWF0ZUltYWdlU3RyZWFtID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRoYXQgPSB7fTtcbiAgICB2YXIgX2NvbmZpZyA9IG51bGw7XG5cbiAgICB2YXIgd2lkdGggPSAwLFxuICAgICAgICBoZWlnaHQgPSAwLFxuICAgICAgICBmcmFtZUlkeCA9IDAsXG4gICAgICAgIHBhdXNlZCA9IHRydWUsXG4gICAgICAgIGxvYWRlZCA9IGZhbHNlLFxuICAgICAgICBpbWdBcnJheSA9IG51bGwsXG4gICAgICAgIHNpemUgPSAwLFxuICAgICAgICBvZmZzZXQgPSAxLFxuICAgICAgICBiYXNlVXJsID0gbnVsbCxcbiAgICAgICAgZW5kZWQgPSBmYWxzZSxcbiAgICAgICAgY2FsY3VsYXRlZFdpZHRoLFxuICAgICAgICBjYWxjdWxhdGVkSGVpZ2h0LFxuICAgICAgICBfZXZlbnROYW1lcyA9IFsnY2FucmVjb3JkJywgJ2VuZGVkJ10sXG4gICAgICAgIF9ldmVudEhhbmRsZXJzID0ge30sXG4gICAgICAgIF90b3BSaWdodCA9IHt4OiAwLCB5OiAwfSxcbiAgICAgICAgX2NhbnZhc1NpemUgPSB7eDogMCwgeTogMH07XG5cbiAgICBmdW5jdGlvbiBsb2FkSW1hZ2VzKCkge1xuICAgICAgICBsb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgSW1hZ2VMb2FkZXIubG9hZChiYXNlVXJsLCBmdW5jdGlvbihpbWdzKSB7XG4gICAgICAgICAgICBpbWdBcnJheSA9IGltZ3M7XG4gICAgICAgICAgICBpZiAoaW1nc1swXS50YWdzICYmIGltZ3NbMF0udGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaW1nc1swXS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGltZ3NbMF0uaW1nLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGltZ3NbMF0uaW1nLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBpbWdzWzBdLmltZy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGltZ3NbMF0uaW1nLndpZHRoO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGltZ3NbMF0uaW1nLmhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGN1bGF0ZWRXaWR0aCA9XG4gICAgICAgICAgICAgICAgX2NvbmZpZy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gX2NvbmZpZy5zaXplIDogTWF0aC5mbG9vcigod2lkdGggLyBoZWlnaHQpICogX2NvbmZpZy5zaXplKSA6IHdpZHRoO1xuICAgICAgICAgICAgY2FsY3VsYXRlZEhlaWdodCA9XG4gICAgICAgICAgICAgICAgX2NvbmZpZy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gTWF0aC5mbG9vcigoaGVpZ2h0IC8gd2lkdGgpICogX2NvbmZpZy5zaXplKSA6IF9jb25maWcuc2l6ZSA6IGhlaWdodDtcbiAgICAgICAgICAgIF9jYW52YXNTaXplLnggPSBjYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICBfY2FudmFzU2l6ZS55ID0gY2FsY3VsYXRlZEhlaWdodDtcbiAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBmcmFtZUlkeCA9IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHB1Ymxpc2hFdmVudChcImNhbnJlY29yZFwiLCBbXSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSwgb2Zmc2V0LCBzaXplLCBfY29uZmlnLnNlcXVlbmNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwdWJsaXNoRXZlbnQoZXZlbnROYW1lLCBhcmdzKSB7XG4gICAgICAgIHZhciBqLFxuICAgICAgICAgICAgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbal0uYXBwbHkodGhhdCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHRoYXQudHJpZ2dlciA9IHB1Ymxpc2hFdmVudDtcblxuICAgIHRoYXQuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRXaWR0aDtcbiAgICB9O1xuXG4gICAgdGhhdC5nZXRIZWlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRIZWlnaHQ7XG4gICAgfTtcblxuICAgIHRoYXQuc2V0V2lkdGggPSBmdW5jdGlvbihuZXdXaWR0aCkge1xuICAgICAgICBjYWxjdWxhdGVkV2lkdGggPSBuZXdXaWR0aDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRIZWlnaHQgPSBmdW5jdGlvbihuZXdIZWlnaHQpIHtcbiAgICAgICAgY2FsY3VsYXRlZEhlaWdodCA9IG5ld0hlaWdodDtcbiAgICB9O1xuXG4gICAgdGhhdC5nZXRSZWFsV2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH07XG5cbiAgICB0aGF0LmdldFJlYWxIZWlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRJbnB1dFN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBfY29uZmlnID0gc3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLnNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYmFzZVVybCA9IHN0cmVhbS5zcmM7XG4gICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VVcmwgPSBzdHJlYW0uc3JjO1xuICAgICAgICAgICAgc2l6ZSA9IHN0cmVhbS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbG9hZEltYWdlcygpO1xuICAgIH07XG5cbiAgICB0aGF0LmVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBlbmRlZDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbigpIHt9O1xuXG4gICAgdGhhdC5nZXRDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jb25maWc7XG4gICAgfTtcblxuICAgIHRoYXQucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdGhhdC5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICB0aGF0LnNldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24odGltZSkge1xuICAgICAgICBmcmFtZUlkeCA9IHRpbWU7XG4gICAgfTtcblxuICAgIHRoYXQuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmKSB7XG4gICAgICAgIGlmIChfZXZlbnROYW1lcy5pbmRleE9mKGV2ZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICghX2V2ZW50SGFuZGxlcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0ucHVzaChmKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGF0LnNldFRvcFJpZ2h0ID0gZnVuY3Rpb24odG9wUmlnaHQpIHtcbiAgICAgICAgX3RvcFJpZ2h0LnggPSB0b3BSaWdodC54O1xuICAgICAgICBfdG9wUmlnaHQueSA9IHRvcFJpZ2h0Lnk7XG4gICAgfTtcblxuICAgIHRoYXQuZ2V0VG9wUmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF90b3BSaWdodDtcbiAgICB9O1xuXG4gICAgdGhhdC5zZXRDYW52YXNTaXplID0gZnVuY3Rpb24oY2FudmFzU2l6ZSkge1xuICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FudmFzU2l6ZS54O1xuICAgICAgICBfY2FudmFzU2l6ZS55ID0gY2FudmFzU2l6ZS55O1xuICAgIH07XG5cbiAgICB0aGF0LmdldENhbnZhc1NpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jYW52YXNTaXplO1xuICAgIH07XG5cbiAgICB0aGF0LmdldEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmcmFtZTtcblxuICAgICAgICBpZiAoIWxvYWRlZCl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgICAgICAgZnJhbWUgPSBpbWdBcnJheVtmcmFtZUlkeF07XG4gICAgICAgICAgICBpZiAoZnJhbWVJZHggPCAoc2l6ZSAtIDEpKSB7XG4gICAgICAgICAgICAgICAgZnJhbWVJZHgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwdWJsaXNoRXZlbnQoXCJlbmRlZFwiLCBbXSk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhhdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IElucHV0U3RyZWFtO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2lucHV0L2lucHV0X3N0cmVhbS5qcyIsImltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi4vY29tbW9uL2ltYWdlX3dyYXBwZXInO1xuaW1wb3J0IHtcbiAgICBjYWxjdWxhdGVQYXRjaFNpemUsXG4gICAgb3RzdVRocmVzaG9sZCxcbiAgICBoc3YycmdiLFxuICAgIGNsdXN0ZXIsXG4gICAgdG9wR2VuZXJpYyxcbiAgICBpbWFnZVJlZixcbiAgICBoYWxmU2FtcGxlLFxuICAgIGNvbXB1dGVJbWFnZUFyZWFcbn0gZnJvbSAnLi4vY29tbW9uL2N2X3V0aWxzJztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcbmltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgUmFzdGVyaXplciBmcm9tICcuL3Jhc3Rlcml6ZXInO1xuaW1wb3J0IFRyYWNlciBmcm9tICcuL3RyYWNlcic7XG5pbXBvcnQgc2tlbGV0b25pemVyIGZyb20gJy4vc2tlbGV0b25pemVyJztcbmNvbnN0IHZlYzIgPSB7XG4gICAgY2xvbmU6IHJlcXVpcmUoJ2dsLXZlYzIvY2xvbmUnKSxcbiAgICBkb3Q6ICByZXF1aXJlKCdnbC12ZWMyL2RvdCcpLFxuICAgIHNjYWxlOiByZXF1aXJlKCdnbC12ZWMyL3NjYWxlJyksXG4gICAgdHJhbnNmb3JtTWF0MjogcmVxdWlyZSgnZ2wtdmVjMi90cmFuc2Zvcm1NYXQyJylcbn07XG5jb25zdCBtYXQyID0ge1xuICAgIGNvcHk6IHJlcXVpcmUoJ2dsLW1hdDIvY29weScpLFxuICAgIGNyZWF0ZTogcmVxdWlyZSgnZ2wtbWF0Mi9jcmVhdGUnKSxcbiAgICBpbnZlcnQ6IHJlcXVpcmUoJ2dsLW1hdDIvaW52ZXJ0Jylcbn1cblxudmFyIF9jb25maWcsXG4gICAgX2N1cnJlbnRJbWFnZVdyYXBwZXIsXG4gICAgX3NrZWxJbWFnZVdyYXBwZXIsXG4gICAgX3N1YkltYWdlV3JhcHBlcixcbiAgICBfbGFiZWxJbWFnZVdyYXBwZXIsXG4gICAgX3BhdGNoR3JpZCxcbiAgICBfcGF0Y2hMYWJlbEdyaWQsXG4gICAgX2ltYWdlVG9QYXRjaEdyaWQsXG4gICAgX2JpbmFyeUltYWdlV3JhcHBlcixcbiAgICBfcGF0Y2hTaXplLFxuICAgIF9jYW52YXNDb250YWluZXIgPSB7XG4gICAgICAgIGN0eDoge1xuICAgICAgICAgICAgYmluYXJ5OiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIGRvbToge1xuICAgICAgICAgICAgYmluYXJ5OiBudWxsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIF9udW1QYXRjaGVzID0ge3g6IDAsIHk6IDB9LFxuICAgIF9pbnB1dEltYWdlV3JhcHBlcixcbiAgICBfc2tlbGV0b25pemVyO1xuXG5mdW5jdGlvbiBpbml0QnVmZmVycygpIHtcbiAgICB2YXIgc2tlbGV0b25JbWFnZURhdGE7XG5cbiAgICBpZiAoX2NvbmZpZy5oYWxmU2FtcGxlKSB7XG4gICAgICAgIF9jdXJyZW50SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICB4OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gMiB8IDAsXG4gICAgICAgICAgICB5OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gMiB8IDBcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2N1cnJlbnRJbWFnZVdyYXBwZXIgPSBfaW5wdXRJbWFnZVdyYXBwZXI7XG4gICAgfVxuXG4gICAgX3BhdGNoU2l6ZSA9IGNhbGN1bGF0ZVBhdGNoU2l6ZShfY29uZmlnLnBhdGNoU2l6ZSwgX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZSk7XG5cbiAgICBfbnVtUGF0Y2hlcy54ID0gX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gX3BhdGNoU2l6ZS54IHwgMDtcbiAgICBfbnVtUGF0Y2hlcy55ID0gX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gX3BhdGNoU2l6ZS55IHwgMDtcblxuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUsIHVuZGVmaW5lZCwgVWludDhBcnJheSwgZmFsc2UpO1xuXG4gICAgX2xhYmVsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcblxuICAgIHNrZWxldG9uSW1hZ2VEYXRhID0gbmV3IEFycmF5QnVmZmVyKDY0ICogMTAyNCk7XG4gICAgX3N1YkltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIoX3BhdGNoU2l6ZSxcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIDAsIF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSkpO1xuICAgIF9za2VsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLFxuICAgICAgICBuZXcgVWludDhBcnJheShza2VsZXRvbkltYWdlRGF0YSwgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55ICogMywgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55KSxcbiAgICAgICAgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBfc2tlbGV0b25pemVyID0gc2tlbGV0b25pemVyKCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSA/IHNlbGYgOiBnbG9iYWwsIHtcbiAgICAgICAgc2l6ZTogX3BhdGNoU2l6ZS54XG4gICAgfSwgc2tlbGV0b25JbWFnZURhdGEpO1xuXG4gICAgX2ltYWdlVG9QYXRjaEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgeDogKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueCAvIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54KSB8IDAsXG4gICAgICAgIHk6IChfY3VycmVudEltYWdlV3JhcHBlci5zaXplLnkgLyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueSkgfCAwXG4gICAgfSwgdW5kZWZpbmVkLCBBcnJheSwgdHJ1ZSk7XG4gICAgX3BhdGNoR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoX2ltYWdlVG9QYXRjaEdyaWQuc2l6ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIF9wYXRjaExhYmVsR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoX2ltYWdlVG9QYXRjaEdyaWQuc2l6ZSwgdW5kZWZpbmVkLCBJbnQzMkFycmF5LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gaW5pdENhbnZhcygpIHtcbiAgICBpZiAoX2NvbmZpZy51c2VXb3JrZXIgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LmNsYXNzTmFtZSA9IFwiYmluYXJ5QnVmZmVyXCI7XG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dDYW52YXMgPT09IHRydWUpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNkZWJ1Z1wiKS5hcHBlbmRDaGlsZChfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkpO1xuICAgIH1cbiAgICBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnkgPSBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS53aWR0aCA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5oZWlnaHQgPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYm91bmRpbmcgYm94IHdoaWNoIGVuY2xvc2VzIGFsbCB0aGUgZ2l2ZW4gcGF0Y2hlc1xuICogQHJldHVybnMge0FycmF5fSBUaGUgbWluaW1hbCBib3VuZGluZyBib3hcbiAqL1xuZnVuY3Rpb24gYm94RnJvbVBhdGNoZXMocGF0Y2hlcykge1xuICAgIHZhciBvdmVyQXZnLFxuICAgICAgICBpLFxuICAgICAgICBqLFxuICAgICAgICBwYXRjaCxcbiAgICAgICAgdHJhbnNNYXQsXG4gICAgICAgIG1pbnggPVxuICAgICAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueCxcbiAgICAgICAgbWlueSA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55LFxuICAgICAgICBtYXh4ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54LFxuICAgICAgICBtYXh5ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55LFxuICAgICAgICBib3gsXG4gICAgICAgIHNjYWxlO1xuXG4gICAgLy8gZHJhdyBhbGwgcGF0Y2hlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAgb3ZlckF2ZyA9IDA7XG4gICAgZm9yICggaSA9IDA7IGkgPCBwYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgICAgb3ZlckF2ZyArPSBwYXRjaC5yYWQ7XG4gICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93UGF0Y2hlcykge1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7Y29sb3I6IFwicmVkXCJ9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJBdmcgLz0gcGF0Y2hlcy5sZW5ndGg7XG4gICAgb3ZlckF2ZyA9IChvdmVyQXZnICogMTgwIC8gTWF0aC5QSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgIGlmIChvdmVyQXZnIDwgMCkge1xuICAgICAgICBvdmVyQXZnICs9IDE4MDtcbiAgICB9XG5cbiAgICBvdmVyQXZnID0gKDE4MCAtIG92ZXJBdmcpICogTWF0aC5QSSAvIDE4MDtcbiAgICB0cmFuc01hdCA9IG1hdDIuY29weShtYXQyLmNyZWF0ZSgpLCBbTWF0aC5jb3Mob3ZlckF2ZyksIE1hdGguc2luKG92ZXJBdmcpLCAtTWF0aC5zaW4ob3ZlckF2ZyksIE1hdGguY29zKG92ZXJBdmcpXSk7XG5cbiAgICAvLyBpdGVyYXRlIG92ZXIgcGF0Y2hlcyBhbmQgcm90YXRlIGJ5IGFuZ2xlXG4gICAgZm9yICggaSA9IDA7IGkgPCBwYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgICAgZm9yICggaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIHZlYzIudHJhbnNmb3JtTWF0MihwYXRjaC5ib3hbal0sIHBhdGNoLmJveFtqXSwgdHJhbnNNYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLmJveEZyb21QYXRjaGVzLnNob3dUcmFuc2Zvcm1lZCkge1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChwYXRjaC5ib3gsIHt4OiAwLCB5OiAxfSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7Y29sb3I6ICcjOTlmZjAwJywgbGluZVdpZHRoOiAyfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaW5kIGJvdW5kaW5nIGJveFxuICAgIGZvciAoIGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzBdIDwgbWlueCkge1xuICAgICAgICAgICAgICAgIG1pbnggPSBwYXRjaC5ib3hbal1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzBdID4gbWF4eCkge1xuICAgICAgICAgICAgICAgIG1heHggPSBwYXRjaC5ib3hbal1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzFdIDwgbWlueSkge1xuICAgICAgICAgICAgICAgIG1pbnkgPSBwYXRjaC5ib3hbal1bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzFdID4gbWF4eSkge1xuICAgICAgICAgICAgICAgIG1heHkgPSBwYXRjaC5ib3hbal1bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBib3ggPSBbW21pbngsIG1pbnldLCBbbWF4eCwgbWlueV0sIFttYXh4LCBtYXh5XSwgW21pbngsIG1heHldXTtcblxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93VHJhbnNmb3JtZWRCb3gpIHtcbiAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChib3gsIHt4OiAwLCB5OiAxfSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7Y29sb3I6ICcjZmYwMDAwJywgbGluZVdpZHRoOiAyfSk7XG4gICAgfVxuXG4gICAgc2NhbGUgPSBfY29uZmlnLmhhbGZTYW1wbGUgPyAyIDogMTtcbiAgICAvLyByZXZlcnNlIHJvdGF0aW9uO1xuICAgIHRyYW5zTWF0ID0gbWF0Mi5pbnZlcnQodHJhbnNNYXQsIHRyYW5zTWF0KTtcbiAgICBmb3IgKCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDIoYm94W2pdLCBib3hbal0sIHRyYW5zTWF0KTtcbiAgICB9XG5cbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd0JCKSB7XG4gICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgoYm94LCB7eDogMCwgeTogMX0sIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSwge2NvbG9yOiAnI2ZmMDAwMCcsIGxpbmVXaWR0aDogMn0pO1xuICAgIH1cblxuICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgIHZlYzIuc2NhbGUoYm94W2pdLCBib3hbal0sIHNjYWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm94O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaW5hcnkgaW1hZ2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2VcbiAqL1xuZnVuY3Rpb24gYmluYXJpemVJbWFnZSgpIHtcbiAgICBvdHN1VGhyZXNob2xkKF9jdXJyZW50SW1hZ2VXcmFwcGVyLCBfYmluYXJ5SW1hZ2VXcmFwcGVyKTtcbiAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnplcm9Cb3JkZXIoKTtcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd0NhbnZhcykge1xuICAgICAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNob3coX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCAyNTUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBpbWFnZVxuICogZXh0cmFjdCBwYXRjaGVzXG4gKi9cbmZ1bmN0aW9uIGZpbmRQYXRjaGVzKCkge1xuICAgIHZhciBpLFxuICAgICAgICBqLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBtb21lbnRzLFxuICAgICAgICBwYXRjaGVzRm91bmQgPSBbXSxcbiAgICAgICAgcmFzdGVyaXplcixcbiAgICAgICAgcmFzdGVyUmVzdWx0LFxuICAgICAgICBwYXRjaDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgX251bVBhdGNoZXMueDsgaSsrKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBfbnVtUGF0Y2hlcy55OyBqKyspIHtcbiAgICAgICAgICAgIHggPSBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueCAqIGk7XG4gICAgICAgICAgICB5ID0gX3N1YkltYWdlV3JhcHBlci5zaXplLnkgKiBqO1xuXG4gICAgICAgICAgICAvLyBzZXBlcmF0ZSBwYXJ0c1xuICAgICAgICAgICAgc2tlbGV0b25pemUoeCwgeSk7XG5cbiAgICAgICAgICAgIC8vIFJhc3Rlcml6ZSwgZmluZCBpbmRpdmlkdWFsIGJhcnNcbiAgICAgICAgICAgIF9za2VsSW1hZ2VXcmFwcGVyLnplcm9Cb3JkZXIoKTtcbiAgICAgICAgICAgIEFycmF5SGVscGVyLmluaXQoX2xhYmVsSW1hZ2VXcmFwcGVyLmRhdGEsIDApO1xuICAgICAgICAgICAgcmFzdGVyaXplciA9IFJhc3Rlcml6ZXIuY3JlYXRlKF9za2VsSW1hZ2VXcmFwcGVyLCBfbGFiZWxJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgcmFzdGVyUmVzdWx0ID0gcmFzdGVyaXplci5yYXN0ZXJpemUoMCk7XG5cbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93TGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgX2xhYmVsSW1hZ2VXcmFwcGVyLm92ZXJsYXkoX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCBNYXRoLmZsb29yKDM2MCAvIHJhc3RlclJlc3VsdC5jb3VudCksXG4gICAgICAgICAgICAgICAgICAgIHt4OiB4LCB5OiB5fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBtb21lbnRzIGZyb20gdGhlIHNrZWxldG9uaXplZCBwYXRjaFxuICAgICAgICAgICAgbW9tZW50cyA9IF9sYWJlbEltYWdlV3JhcHBlci5tb21lbnRzKHJhc3RlclJlc3VsdC5jb3VudCk7XG5cbiAgICAgICAgICAgIC8vIGV4dHJhY3QgZWxpZ2libGUgcGF0Y2hlc1xuICAgICAgICAgICAgcGF0Y2hlc0ZvdW5kID0gcGF0Y2hlc0ZvdW5kLmNvbmNhdChkZXNjcmliZVBhdGNoKG1vbWVudHMsIFtpLCBqXSwgeCwgeSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dGb3VuZFBhdGNoZXMpIHtcbiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwYXRjaGVzRm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhdGNoID0gcGF0Y2hlc0ZvdW5kW2ldO1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgIHtjb2xvcjogXCIjOTlmZjAwXCIsIGxpbmVXaWR0aDogMn0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aG9zZSBjb25uZWN0ZWQgYXJlYXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCA2IHBhdGNoZXNcbiAqIGFuZCByZXR1cm5zIHRoZW0gb3JkZXJlZCBERVNDIGJ5IHRoZSBudW1iZXIgb2YgY29udGFpbmVkIHBhdGNoZXNcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMYWJlbFxuICovXG5mdW5jdGlvbiBmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKXtcbiAgICB2YXIgaSxcbiAgICAgICAgc3VtLFxuICAgICAgICBsYWJlbEhpc3QgPSBbXSxcbiAgICAgICAgdG9wTGFiZWxzID0gW107XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IG1heExhYmVsOyBpKyspIHtcbiAgICAgICAgbGFiZWxIaXN0LnB1c2goMCk7XG4gICAgfVxuICAgIHN1bSA9IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDtcbiAgICB3aGlsZSAoc3VtLS0pIHtcbiAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW3N1bV0gPiAwKSB7XG4gICAgICAgICAgICBsYWJlbEhpc3RbX3BhdGNoTGFiZWxHcmlkLmRhdGFbc3VtXSAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsYWJlbEhpc3QgPSBsYWJlbEhpc3QubWFwKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICAgIGxhYmVsOiBpZHggKyAxXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBsYWJlbEhpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLnZhbCAtIGEudmFsO1xuICAgIH0pO1xuXG4gICAgLy8gZXh0cmFjdCB0b3AgYXJlYXMgd2l0aCBhdCBsZWFzdCA2IHBhdGNoZXMgcHJlc2VudFxuICAgIHRvcExhYmVscyA9IGxhYmVsSGlzdC5maWx0ZXIoZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgcmV0dXJuIGVsLnZhbCA+PSA1O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvcExhYmVscztcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBmaW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCkge1xuICAgIHZhciBpLFxuICAgICAgICBqLFxuICAgICAgICBzdW0sXG4gICAgICAgIHBhdGNoZXMgPSBbXSxcbiAgICAgICAgcGF0Y2gsXG4gICAgICAgIGJveCxcbiAgICAgICAgYm94ZXMgPSBbXSxcbiAgICAgICAgaHN2ID0gWzAsIDEsIDFdLFxuICAgICAgICByZ2IgPSBbMCwgMCwgMF07XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IHRvcExhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gPSBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgICAgIHBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKHN1bS0tKSB7XG4gICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbc3VtXSA9PT0gdG9wTGFiZWxzW2ldLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW3N1bV07XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3ggPSBib3hGcm9tUGF0Y2hlcyhwYXRjaGVzKTtcbiAgICAgICAgaWYgKGJveCkge1xuICAgICAgICAgICAgYm94ZXMucHVzaChib3gpO1xuXG4gICAgICAgICAgICAvLyBkcmF3IHBhdGNoLWxhYmVscyBpZiByZXF1ZXN0ZWRcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBhdGNoZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2pdO1xuICAgICAgICAgICAgICAgICAgICBoc3ZbMF0gPSAodG9wTGFiZWxzW2ldLmxhYmVsIC8gKG1heExhYmVsICsgMSkpICogMzYwO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbG9yOiBcInJnYihcIiArIHJnYi5qb2luKFwiLFwiKSArIFwiKVwiLCBsaW5lV2lkdGg6IDJ9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJveGVzO1xufVxuXG4vKipcbiAqIEZpbmQgc2ltaWxhciBtb21lbnRzICh2aWEgY2x1c3RlcilcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb21lbnRzXG4gKi9cbmZ1bmN0aW9uIHNpbWlsYXJNb21lbnRzKG1vbWVudHMpIHtcbiAgICB2YXIgY2x1c3RlcnMgPSBjbHVzdGVyKG1vbWVudHMsIDAuOTApO1xuICAgIHZhciB0b3BDbHVzdGVyID0gdG9wR2VuZXJpYyhjbHVzdGVycywgMSwgZnVuY3Rpb24oZSkge1xuICAgICAgICByZXR1cm4gZS5nZXRQb2ludHMoKS5sZW5ndGg7XG4gICAgfSk7XG4gICAgdmFyIHBvaW50cyA9IFtdLCByZXN1bHQgPSBbXTtcbiAgICBpZiAodG9wQ2x1c3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcG9pbnRzID0gdG9wQ2x1c3RlclswXS5pdGVtLmdldFBvaW50cygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9pbnRzW2ldLnBvaW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBza2VsZXRvbml6ZSh4LCB5KSB7XG4gICAgX2JpbmFyeUltYWdlV3JhcHBlci5zdWJJbWFnZUFzQ29weShfc3ViSW1hZ2VXcmFwcGVyLCBpbWFnZVJlZih4LCB5KSk7XG4gICAgX3NrZWxldG9uaXplci5za2VsZXRvbml6ZSgpO1xuXG4gICAgLy8gU2hvdyBza2VsZXRvbiBpZiByZXF1ZXN0ZWRcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd1NrZWxldG9uKSB7XG4gICAgICAgIF9za2VsSW1hZ2VXcmFwcGVyLm92ZXJsYXkoX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCAzNjAsIGltYWdlUmVmKHgsIHkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIGRlc2NyaWJlcyB0aG9zZSBwYXRjaGVzIHdoaWNoIHNlZW0gdG8gY29udGFpbiBhIGJhcmNvZGUgcGF0dGVyblxuICogQHBhcmFtIHtBcnJheX0gbW9tZW50c1xuICogQHBhcmFtIHtPYmplY3R9IHBhdGNoUG9zLFxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJucyB7QXJyYXl9IGxpc3Qgb2YgcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBkZXNjcmliZVBhdGNoKG1vbWVudHMsIHBhdGNoUG9zLCB4LCB5KSB7XG4gICAgdmFyIGssXG4gICAgICAgIGF2ZyxcbiAgICAgICAgZWxpZ2libGVNb21lbnRzID0gW10sXG4gICAgICAgIG1hdGNoaW5nTW9tZW50cyxcbiAgICAgICAgcGF0Y2gsXG4gICAgICAgIHBhdGNoZXNGb3VuZCA9IFtdLFxuICAgICAgICBtaW5Db21wb25lbnRXZWlnaHQgPSBNYXRoLmNlaWwoX3BhdGNoU2l6ZS54IC8gMyk7XG5cbiAgICBpZiAobW9tZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAvLyBvbmx5IGNvbGxlY3QgbW9tZW50cyB3aGljaCdzIGFyZWEgY292ZXJzIGF0IGxlYXN0IG1pbkNvbXBvbmVudFdlaWdodCBwaXhlbHMuXG4gICAgICAgIGZvciAoIGsgPSAwOyBrIDwgbW9tZW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgaWYgKG1vbWVudHNba10ubTAwID4gbWluQ29tcG9uZW50V2VpZ2h0KSB7XG4gICAgICAgICAgICAgICAgZWxpZ2libGVNb21lbnRzLnB1c2gobW9tZW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBhdCBsZWFzdCAyIG1vbWVudHMgYXJlIGZvdW5kIHdoaWNoIGhhdmUgYXQgbGVhc3QgbWluQ29tcG9uZW50V2VpZ2h0cyBjb3ZlcmVkXG4gICAgICAgIGlmIChlbGlnaWJsZU1vbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIG1hdGNoaW5nTW9tZW50cyA9IHNpbWlsYXJNb21lbnRzKGVsaWdpYmxlTW9tZW50cyk7XG4gICAgICAgICAgICBhdmcgPSAwO1xuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBzaW1pbGFyaXR5IG9mIHRoZSBtb21lbnRzXG4gICAgICAgICAgICBmb3IgKCBrID0gMDsgayA8IG1hdGNoaW5nTW9tZW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGF2ZyArPSBtYXRjaGluZ01vbWVudHNba10ucmFkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbmx5IHR3byBvZiB0aGUgbW9tZW50cyBhcmUgYWxsb3dlZCBub3QgdG8gZml0IGludG8gdGhlIGVxdWF0aW9uXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHBhdGNoIHRvIHRoZSBzZXRcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ01vbWVudHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAmJiBtYXRjaGluZ01vbWVudHMubGVuZ3RoID49IChlbGlnaWJsZU1vbWVudHMubGVuZ3RoIC8gNCkgKiAzXG4gICAgICAgICAgICAgICAgICAgICYmIG1hdGNoaW5nTW9tZW50cy5sZW5ndGggPiBtb21lbnRzLmxlbmd0aCAvIDQpIHtcbiAgICAgICAgICAgICAgICBhdmcgLz0gbWF0Y2hpbmdNb21lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBwYXRjaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHBhdGNoUG9zWzFdICogX251bVBhdGNoZXMueCArIHBhdGNoUG9zWzBdLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB5XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGJveDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCwgeV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54LCB5XSksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKFt4ICsgX3N1YkltYWdlV3JhcHBlci5zaXplLngsIHkgKyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCwgeSArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55XSlcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgbW9tZW50czogbWF0Y2hpbmdNb21lbnRzLFxuICAgICAgICAgICAgICAgICAgICByYWQ6IGF2ZyxcbiAgICAgICAgICAgICAgICAgICAgdmVjOiB2ZWMyLmNsb25lKFtNYXRoLmNvcyhhdmcpLCBNYXRoLnNpbihhdmcpXSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBhdGNoZXNGb3VuZC5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0Y2hlc0ZvdW5kO1xufVxuXG4vKipcbiAqIGZpbmRzIHBhdGNoZXMgd2hpY2ggYXJlIGNvbm5lY3RlZCBhbmQgc2hhcmUgdGhlIHNhbWUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXRjaGVzRm91bmRcbiAqL1xuZnVuY3Rpb24gcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKSB7XG4gICAgdmFyIGxhYmVsID0gMCxcbiAgICAgICAgdGhyZXNob2xkID0gMC45NSxcbiAgICAgICAgY3VycklkeCA9IDAsXG4gICAgICAgIGosXG4gICAgICAgIHBhdGNoLFxuICAgICAgICBoc3YgPSBbMCwgMSwgMV0sXG4gICAgICAgIHJnYiA9IFswLCAwLCAwXTtcblxuICAgIGZ1bmN0aW9uIG5vdFlldFByb2Nlc3NlZCgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtpXSA9PT0gMCAmJiBfcGF0Y2hHcmlkLmRhdGFbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3BhdGNoTGFiZWxHcmlkLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFjZShjdXJyZW50SWR4KSB7XG4gICAgICAgIHZhciB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIGN1cnJlbnRQYXRjaCxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIGN1cnJlbnQgPSB7XG4gICAgICAgICAgICAgICAgeDogY3VycmVudElkeCAlIF9wYXRjaExhYmVsR3JpZC5zaXplLngsXG4gICAgICAgICAgICAgICAgeTogKGN1cnJlbnRJZHggLyBfcGF0Y2hMYWJlbEdyaWQuc2l6ZS54KSB8IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaW1pbGFyaXR5O1xuXG4gICAgICAgIGlmIChjdXJyZW50SWR4IDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW2N1cnJlbnRJZHhdO1xuICAgICAgICAgICAgLy8gYXNzaWduIGxhYmVsXG4gICAgICAgICAgICBfcGF0Y2hMYWJlbEdyaWQuZGF0YVtjdXJyZW50SWR4XSA9IGxhYmVsO1xuICAgICAgICAgICAgZm9yICggZGlyID0gMDsgZGlyIDwgVHJhY2VyLnNlYXJjaERpcmVjdGlvbnMubGVuZ3RoOyBkaXIrKykge1xuICAgICAgICAgICAgICAgIHkgPSBjdXJyZW50LnkgKyBUcmFjZXIuc2VhcmNoRGlyZWN0aW9uc1tkaXJdWzBdO1xuICAgICAgICAgICAgICAgIHggPSBjdXJyZW50LnggKyBUcmFjZXIuc2VhcmNoRGlyZWN0aW9uc1tkaXJdWzFdO1xuICAgICAgICAgICAgICAgIGlkeCA9IHkgKiBfcGF0Y2hMYWJlbEdyaWQuc2l6ZS54ICsgeDtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGlmIHBhdGNoIGVtcHR5XG4gICAgICAgICAgICAgICAgaWYgKF9wYXRjaEdyaWQuZGF0YVtpZHhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXRjaExhYmVsR3JpZC5kYXRhW2lkeF0gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbaWR4XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5ID0gTWF0aC5hYnModmVjMi5kb3QoX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtpZHhdLnZlYywgY3VycmVudFBhdGNoLnZlYykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHByZXBhcmUgZm9yIGZpbmRpbmcgdGhlIHJpZ2h0IHBhdGNoZXNcbiAgICBBcnJheUhlbHBlci5pbml0KF9wYXRjaEdyaWQuZGF0YSwgMCk7XG4gICAgQXJyYXlIZWxwZXIuaW5pdChfcGF0Y2hMYWJlbEdyaWQuZGF0YSwgMCk7XG4gICAgQXJyYXlIZWxwZXIuaW5pdChfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhLCBudWxsKTtcblxuICAgIGZvciAoIGogPSAwOyBqIDwgcGF0Y2hlc0ZvdW5kLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHBhdGNoID0gcGF0Y2hlc0ZvdW5kW2pdO1xuICAgICAgICBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW3BhdGNoLmluZGV4XSA9IHBhdGNoO1xuICAgICAgICBfcGF0Y2hHcmlkLmRhdGFbcGF0Y2guaW5kZXhdID0gMTtcbiAgICB9XG5cbiAgICAvLyByYXN0ZXJpemUgdGhlIHBhdGNoZXMgZm91bmQgdG8gZGV0ZXJtaW5lIGFyZWFcbiAgICBfcGF0Y2hHcmlkLnplcm9Cb3JkZXIoKTtcblxuICAgIHdoaWxlICgoIGN1cnJJZHggPSBub3RZZXRQcm9jZXNzZWQoKSkgPCBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgbGFiZWwrKztcbiAgICAgICAgdHJhY2UoY3VycklkeCk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dQYXRjaExhYmVscykge1xuICAgICAgICBmb3IgKCBqID0gMDsgaiA8IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbal0gPiAwICYmIF9wYXRjaExhYmVsR3JpZC5kYXRhW2pdIDw9IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW2pdO1xuICAgICAgICAgICAgICAgIGhzdlswXSA9IChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSAvIChsYWJlbCArIDEpKSAqIDM2MDtcbiAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdSZWN0KHBhdGNoLnBvcywgX3N1YkltYWdlV3JhcHBlci5zaXplLCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksXG4gICAgICAgICAgICAgICAgICAgIHtjb2xvcjogXCJyZ2IoXCIgKyByZ2Iuam9pbihcIixcIikgKyBcIilcIiwgbGluZVdpZHRoOiAyfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0OiBmdW5jdGlvbihpbnB1dEltYWdlV3JhcHBlciwgY29uZmlnKSB7XG4gICAgICAgIF9jb25maWcgPSBjb25maWc7XG4gICAgICAgIF9pbnB1dEltYWdlV3JhcHBlciA9IGlucHV0SW1hZ2VXcmFwcGVyO1xuXG4gICAgICAgIGluaXRCdWZmZXJzKCk7XG4gICAgICAgIGluaXRDYW52YXMoKTtcbiAgICB9LFxuXG4gICAgbG9jYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHBhdGNoZXNGb3VuZCxcbiAgICAgICAgICAgIHRvcExhYmVscyxcbiAgICAgICAgICAgIGJveGVzO1xuXG4gICAgICAgIGlmIChfY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgICAgIGhhbGZTYW1wbGUoX2lucHV0SW1hZ2VXcmFwcGVyLCBfY3VycmVudEltYWdlV3JhcHBlcik7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5hcml6ZUltYWdlKCk7XG4gICAgICAgIHBhdGNoZXNGb3VuZCA9IGZpbmRQYXRjaGVzKCk7XG4gICAgICAgIC8vIHJldHVybiB1bmxlc3MgNSUgb3IgbW9yZSBwYXRjaGVzIGFyZSBmb3VuZFxuICAgICAgICBpZiAocGF0Y2hlc0ZvdW5kLmxlbmd0aCA8IF9udW1QYXRjaGVzLnggKiBfbnVtUGF0Y2hlcy55ICogMC4wNSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByYXN0ZXJyaXplIGFyZWEgYnkgY29tcGFyaW5nIGFuZ3VsYXIgc2ltaWxhcml0eTtcbiAgICAgICAgdmFyIG1heExhYmVsID0gcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKTtcbiAgICAgICAgaWYgKG1heExhYmVsIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWFyY2ggZm9yIGFyZWEgd2l0aCB0aGUgbW9zdCBwYXRjaGVzIChiaWdnZXN0IGNvbm5lY3RlZCBhcmVhKVxuICAgICAgICB0b3BMYWJlbHMgPSBmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKTtcbiAgICAgICAgaWYgKHRvcExhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYm94ZXMgPSBmaW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCk7XG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9LFxuXG4gICAgY2hlY2tJbWFnZUNvbnN0cmFpbnRzOiBmdW5jdGlvbihpbnB1dFN0cmVhbSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwYXRjaFNpemUsXG4gICAgICAgICAgICB3aWR0aCA9IGlucHV0U3RyZWFtLmdldFdpZHRoKCksXG4gICAgICAgICAgICBoZWlnaHQgPSBpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKSxcbiAgICAgICAgICAgIGhhbGZTYW1wbGUgPSBjb25maWcuaGFsZlNhbXBsZSA/IDAuNSA6IDEsXG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgYXJlYTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBhcmVhXG4gICAgICAgIGlmIChpbnB1dFN0cmVhbS5nZXRDb25maWcoKS5hcmVhKSB7XG4gICAgICAgICAgICBhcmVhID0gY29tcHV0ZUltYWdlQXJlYSh3aWR0aCwgaGVpZ2h0LCBpbnB1dFN0cmVhbS5nZXRDb25maWcoKS5hcmVhKTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldFRvcFJpZ2h0KHt4OiBhcmVhLnN4LCB5OiBhcmVhLnN5fSk7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbS5zZXRDYW52YXNTaXplKHt4OiB3aWR0aCwgeTogaGVpZ2h0fSk7XG4gICAgICAgICAgICB3aWR0aCA9IGFyZWEuc3c7XG4gICAgICAgICAgICBoZWlnaHQgPSBhcmVhLnNoO1xuICAgICAgICB9XG5cbiAgICAgICAgc2l6ZSA9IHtcbiAgICAgICAgICAgIHg6IE1hdGguZmxvb3Iod2lkdGggKiBoYWxmU2FtcGxlKSxcbiAgICAgICAgICAgIHk6IE1hdGguZmxvb3IoaGVpZ2h0ICogaGFsZlNhbXBsZSlcbiAgICAgICAgfTtcblxuICAgICAgICBwYXRjaFNpemUgPSBjYWxjdWxhdGVQYXRjaFNpemUoY29uZmlnLnBhdGNoU2l6ZSwgc2l6ZSk7XG4gICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGF0Y2gtU2l6ZTogXCIgKyBKU09OLnN0cmluZ2lmeShwYXRjaFNpemUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0U3RyZWFtLnNldFdpZHRoKE1hdGguZmxvb3IoTWF0aC5mbG9vcihzaXplLnggLyBwYXRjaFNpemUueCkgKiAoMSAvIGhhbGZTYW1wbGUpICogcGF0Y2hTaXplLngpKTtcbiAgICAgICAgaW5wdXRTdHJlYW0uc2V0SGVpZ2h0KE1hdGguZmxvb3IoTWF0aC5mbG9vcihzaXplLnkgLyBwYXRjaFNpemUueSkgKiAoMSAvIGhhbGZTYW1wbGUpICogcGF0Y2hTaXplLnkpKTtcblxuICAgICAgICBpZiAoKGlucHV0U3RyZWFtLmdldFdpZHRoKCkgJSBwYXRjaFNpemUueCkgPT09IDAgJiYgKGlucHV0U3RyZWFtLmdldEhlaWdodCgpICUgcGF0Y2hTaXplLnkpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzOiBXaWR0aCAoXCIgK1xuICAgICAgICAgICAgd2lkdGggKyBcIiApYW5kIGhlaWdodCAoXCIgKyBoZWlnaHQgK1xuICAgICAgICAgICAgXCIpIG11c3QgYSBtdWx0aXBsZSBvZiBcIiArIHBhdGNoU2l6ZS54KTtcbiAgICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2F0b3IvYmFyY29kZV9sb2NhdG9yLmpzIiwiaW1wb3J0IFRyYWNlciBmcm9tICcuL3RyYWNlcic7XG5cbi8qKlxuICogaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vVGlwcy80MDcxNzIvQ29ubmVjdGVkLUNvbXBvbmVudC1MYWJlbGluZy1hbmQtVmVjdG9yaXphdGlvblxuICovXG52YXIgUmFzdGVyaXplciA9IHtcbiAgICBjcmVhdGVDb250b3VyMkQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlyOiBudWxsLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBmaXJzdFZlcnRleDogbnVsbCxcbiAgICAgICAgICAgIGluc2lkZUNvbnRvdXJzOiBudWxsLFxuICAgICAgICAgICAgbmV4dHBlZXI6IG51bGwsXG4gICAgICAgICAgICBwcmV2cGVlcjogbnVsbFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgQ09OVE9VUl9ESVI6IHtcbiAgICAgICAgQ1dfRElSOiAwLFxuICAgICAgICBDQ1dfRElSOiAxLFxuICAgICAgICBVTktOT1dOX0RJUjogMlxuICAgIH0sXG4gICAgRElSOiB7XG4gICAgICAgIE9VVFNJREVfRURHRTogLTMyNzY3LFxuICAgICAgICBJTlNJREVfRURHRTogLTMyNzY2XG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKSB7XG4gICAgICAgIHZhciBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YSxcbiAgICAgICAgICAgIGxhYmVsRGF0YSA9IGxhYmVsV3JhcHBlci5kYXRhLFxuICAgICAgICAgICAgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54LFxuICAgICAgICAgICAgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueSxcbiAgICAgICAgICAgIHRyYWNlciA9IFRyYWNlci5jcmVhdGUoaW1hZ2VXcmFwcGVyLCBsYWJlbFdyYXBwZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXN0ZXJpemU6IGZ1bmN0aW9uKGRlcHRobGFiZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGJjLFxuICAgICAgICAgICAgICAgICAgICBsYyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgY3gsXG4gICAgICAgICAgICAgICAgICAgIGN5LFxuICAgICAgICAgICAgICAgICAgICBjb2xvck1hcCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgsXG4gICAgICAgICAgICAgICAgICAgIHAsXG4gICAgICAgICAgICAgICAgICAgIGNjLFxuICAgICAgICAgICAgICAgICAgICBzYyxcbiAgICAgICAgICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCA9IDAsXG4gICAgICAgICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDQwMDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2xvck1hcFswXSA9IGltYWdlRGF0YVswXTtcbiAgICAgICAgICAgICAgICBjYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICggY3kgPSAxOyBjeSA8IGhlaWdodCAtIDE7IGN5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3JNYXBbMF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoIGN4ID0gMTsgY3ggPCB3aWR0aCAtIDE7IGN4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN5ICogd2lkdGggKyBjeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbERhdGFbcG9zXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaW1hZ2VEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yICE9PSBiYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBjb25uZWN0ZWRDb3VudCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtsY10gPSBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXggPSB0cmFjZXIuY29udG91clRyYWNpbmcoY3ksIGN4LCBsYywgY29sb3IsIFJhc3Rlcml6ZXIuRElSLk9VVFNJREVfRURHRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gbGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IFJhc3Rlcml6ZXIuY3JlYXRlQ29udG91cjJEKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNXX0RJUjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluZGV4ID0gbGFiZWxpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmZpcnN0VmVydGV4ID0gdmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmV4dHBlZXIgPSBjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluc2lkZUNvbnRvdXJzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MucHJldnBlZXIgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXggPSB0cmFjZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udG91clRyYWNpbmcoY3ksIGN4LCBSYXN0ZXJpemVyLkRJUi5JTlNJREVfRURHRSwgY29sb3IsIGxhYmVsaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBSYXN0ZXJpemVyLmNyZWF0ZUNvbnRvdXIyRCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZmlyc3RWZXJ0ZXggPSB2ZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbnNpZGVDb250b3VycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRobGFiZWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNDV19ESVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNXX0RJUjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbmRleCA9IGRlcHRobGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MgPSBjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHNjICE9PSBudWxsKSAmJiBzYy5pbmRleCAhPT0gbGFiZWxpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IHNjLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0cGVlciA9IHNjLmluc2lkZUNvbnRvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2MuaW5zaWRlQ29udG91cnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLmluc2lkZUNvbnRvdXJzLnByZXZwZWVyID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy5pbnNpZGVDb250b3VycyA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxEYXRhW3Bvc10gPSBsYWJlbGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxEYXRhW3Bvc10gPT09IFJhc3Rlcml6ZXIuRElSLk9VVFNJREVfRURHRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYWJlbERhdGFbcG9zXSA9PT0gUmFzdGVyaXplci5ESVIuSU5TSURFX0VER0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxEYXRhW3Bvc10gPT09IFJhc3Rlcml6ZXIuRElSLklOU0lERV9FREdFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gaW1hZ2VEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvck1hcFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsaW5kZXggPSBsYWJlbERhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwW2xhYmVsaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjID0gY2M7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNjICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjLmluZGV4ID0gZGVwdGhsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgc2MgPSBzYy5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2M6IGNjLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogY29ubmVjdGVkQ291bnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICAgICAgZHJhd0NvbnRvdXI6IGZ1bmN0aW9uKGNhbnZhcywgZmlyc3RDb250b3VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHEgPSBmaXJzdENvbnRvdXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpcSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwO1xuXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcInJlZFwiO1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gcHEuaW5zaWRlQ29udG91cnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpcSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBpcTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcSA9IGlxLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcHE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHEgPSBwcS5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBwcS5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHEuZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ1dfRElSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ0NXX0RJUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImJsdWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmFzdGVyaXplci5DT05UT1VSX0RJUi5VTktOT1dOX0RJUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImdyZWVuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBxLmZpcnN0VmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhwLngsIHAueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHAueCwgcC55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHAgIT09IHEuZmlyc3RWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3Rlcml6ZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYXRvci9yYXN0ZXJpemVyLmpzIiwiLyogQHByZXNlcnZlIEFTTSBCRUdJTiAqL1xuLyogZXNsaW50LWRpc2FibGUgZXFlcWVxKi9cbmZ1bmN0aW9uIFNrZWxldG9uaXplcihzdGRsaWIsIGZvcmVpZ24sIGJ1ZmZlcikge1xuICAgIFwidXNlIGFzbVwiO1xuXG4gICAgdmFyIGltYWdlcyA9IG5ldyBzdGRsaWIuVWludDhBcnJheShidWZmZXIpLFxuICAgICAgICBzaXplID0gZm9yZWlnbi5zaXplIHwgMCxcbiAgICAgICAgaW11bCA9IHN0ZGxpYi5NYXRoLmltdWw7XG5cbiAgICBmdW5jdGlvbiBlcm9kZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyID0gaW5JbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB2ID0gMCxcbiAgICAgICAgICAgIHUgPSAwLFxuICAgICAgICAgICAgc3VtID0gMCxcbiAgICAgICAgICAgIHlTdGFydDEgPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MiA9IDAsXG4gICAgICAgICAgICB4U3RhcnQxID0gMCxcbiAgICAgICAgICAgIHhTdGFydDIgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmb3IgKCB2ID0gMTsgKHYgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHYgPSAodiArIDEpIHwgMCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgIGZvciAoIHUgPSAxOyAodSB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdSA9ICh1ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MSA9IChvZmZzZXQgLSBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MiA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MSA9ICh1IC0gMSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDIgPSAodSArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICBzdW0gPSAoKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDIpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MikgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKChzdW0gfCAwKSA9PSAoNSB8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJ0cmFjdChhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyID0gYUltYWdlUHRyIHwgMDtcbiAgICAgICAgYkltYWdlUHRyID0gYkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID1cbiAgICAgICAgICAgICAgICAoKGltYWdlc1soYUltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkgLSAoaW1hZ2VzWyhiSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYml0d2lzZU9yKGFJbWFnZVB0ciwgYkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBhSW1hZ2VQdHIgPSBhSW1hZ2VQdHIgfCAwO1xuICAgICAgICBiSW1hZ2VQdHIgPSBiSW1hZ2VQdHIgfCAwO1xuICAgICAgICBvdXRJbWFnZVB0ciA9IG91dEltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPVxuICAgICAgICAgICAgICAgICgoaW1hZ2VzWyhhSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSB8IChpbWFnZXNbKGJJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb3VudE5vblplcm8oaW1hZ2VQdHIpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHN1bSA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgc3VtID0gKChzdW0gfCAwKSArIChpbWFnZXNbKGltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoc3VtIHwgMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdChpbWFnZVB0ciwgdmFsdWUpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGluSW1hZ2VQdHIgPSBpbkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHYgPSAwLFxuICAgICAgICAgICAgdSA9IDAsXG4gICAgICAgICAgICBzdW0gPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MSA9IDAsXG4gICAgICAgICAgICB5U3RhcnQyID0gMCxcbiAgICAgICAgICAgIHhTdGFydDEgPSAwLFxuICAgICAgICAgICAgeFN0YXJ0MiA9IDAsXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZvciAoIHYgPSAxOyAodiB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdiA9ICh2ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgZm9yICggdSA9IDE7ICh1IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB1ID0gKHUgKyAxKSB8IDApIHtcbiAgICAgICAgICAgICAgICB5U3RhcnQxID0gKG9mZnNldCAtIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB5U3RhcnQyID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQxID0gKHUgLSAxKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MiA9ICh1ICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgIHN1bSA9ICgoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MikgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQyKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoKHN1bSB8IDApID4gKDAgfCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVtY3B5KHNyY0ltYWdlUHRyLCBkc3RJbWFnZVB0cikge1xuICAgICAgICBzcmNJbWFnZVB0ciA9IHNyY0ltYWdlUHRyIHwgMDtcbiAgICAgICAgZHN0SW1hZ2VQdHIgPSBkc3RJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGRzdEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gKGltYWdlc1soc3JjSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9Cb3JkZXIoaW1hZ2VQdHIpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHggPSAwLFxuICAgICAgICAgICAgeSA9IDA7XG5cbiAgICAgICAgZm9yICggeCA9IDA7ICh4IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB4ID0gKHggKyAxKSB8IDApIHtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB4KSB8IDBdID0gMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB5KSB8IDBdID0gMDtcbiAgICAgICAgICAgIHkgPSAoKHkgKyBzaXplKSAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB5KSB8IDBdID0gMDtcbiAgICAgICAgICAgIHkgPSAoeSArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKCB4ID0gMDsgKHggfCAwKSA8IChzaXplIHwgMCk7IHggPSAoeCArIDEpIHwgMCkge1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICh5ICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2tlbGV0b25pemUoKSB7XG4gICAgICAgIHZhciBzdWJJbWFnZVB0ciA9IDAsXG4gICAgICAgICAgICBlcm9kZWRJbWFnZVB0ciA9IDAsXG4gICAgICAgICAgICB0ZW1wSW1hZ2VQdHIgPSAwLFxuICAgICAgICAgICAgc2tlbEltYWdlUHRyID0gMCxcbiAgICAgICAgICAgIHN1bSA9IDAsXG4gICAgICAgICAgICBkb25lID0gMDtcblxuICAgICAgICBlcm9kZWRJbWFnZVB0ciA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuICAgICAgICB0ZW1wSW1hZ2VQdHIgPSAoZXJvZGVkSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwO1xuICAgICAgICBza2VsSW1hZ2VQdHIgPSAodGVtcEltYWdlUHRyICsgZXJvZGVkSW1hZ2VQdHIpIHwgMDtcblxuICAgICAgICAvLyBpbml0IHNrZWwtaW1hZ2VcbiAgICAgICAgaW5pdChza2VsSW1hZ2VQdHIsIDApO1xuICAgICAgICB6ZXJvQm9yZGVyKHN1YkltYWdlUHRyKTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlcm9kZShzdWJJbWFnZVB0ciwgZXJvZGVkSW1hZ2VQdHIpO1xuICAgICAgICAgICAgZGlsYXRlKGVyb2RlZEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VidHJhY3Qoc3ViSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgdGVtcEltYWdlUHRyKTtcbiAgICAgICAgICAgIGJpdHdpc2VPcihza2VsSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgc2tlbEltYWdlUHRyKTtcbiAgICAgICAgICAgIG1lbWNweShlcm9kZWRJbWFnZVB0ciwgc3ViSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VtID0gY291bnROb25aZXJvKHN1YkltYWdlUHRyKSB8IDA7XG4gICAgICAgICAgICBkb25lID0gKChzdW0gfCAwKSA9PSAwIHwgMCk7XG4gICAgICAgIH0gd2hpbGUgKCFkb25lKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2tlbGV0b25pemU6IHNrZWxldG9uaXplXG4gICAgfTtcbn1cbi8qIEBwcmVzZXJ2ZSBBU00gRU5EICovXG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbml6ZXI7XG4vKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSovXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYXRvci9za2VsZXRvbml6ZXIuanMiLCJpbXBvcnQgQmFyY29kZVJlYWRlciBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuZnVuY3Rpb24gVHdvT2ZGaXZlUmVhZGVyKG9wdHMpIHtcbiAgICBCYXJjb2RlUmVhZGVyLmNhbGwodGhpcywgb3B0cyk7XG4gICAgdGhpcy5iYXJTcGFjZVJhdGlvID0gWzEsIDFdO1xufVxuXG52YXIgTiA9IDEsXG4gICAgVyA9IDMsXG4gICAgcHJvcGVydGllcyA9IHtcbiAgICAgICAgU1RBUlRfUEFUVEVSTjoge3ZhbHVlOiBbVywgTiwgVywgTiwgTiwgTl19LFxuICAgICAgICBTVE9QX1BBVFRFUk46IHt2YWx1ZTogW1csIE4sIE4sIE4sIFddfSxcbiAgICAgICAgQ09ERV9QQVRURVJOOiB7dmFsdWU6IFtcbiAgICAgICAgICAgIFtOLCBOLCBXLCBXLCBOXSxcbiAgICAgICAgICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICAgICAgICAgIFtOLCBXLCBOLCBOLCBXXSxcbiAgICAgICAgICAgIFtXLCBXLCBOLCBOLCBOXSxcbiAgICAgICAgICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICAgICAgICAgIFtXLCBOLCBXLCBOLCBOXSxcbiAgICAgICAgICAgIFtOLCBXLCBXLCBOLCBOXSxcbiAgICAgICAgICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICAgICAgICAgIFtXLCBOLCBOLCBXLCBOXSxcbiAgICAgICAgICAgIFtOLCBXLCBOLCBXLCBOXVxuICAgICAgICBdfSxcbiAgICAgICAgU0lOR0xFX0NPREVfRVJST1I6IHt2YWx1ZTogMC43OCwgd3JpdGFibGU6IHRydWV9LFxuICAgICAgICBBVkdfQ09ERV9FUlJPUjoge3ZhbHVlOiAwLjMwLCB3cml0YWJsZTogdHJ1ZX0sXG4gICAgICAgIEZPUk1BVDoge3ZhbHVlOiBcIjJvZjVcIn1cbiAgICB9O1xuXG5jb25zdCBzdGFydFBhdHRlcm5MZW5ndGggPSBwcm9wZXJ0aWVzLlNUQVJUX1BBVFRFUk4udmFsdWUucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFyY29kZVJlYWRlci5wcm90b3R5cGUsIHByb3BlcnRpZXMpO1xuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR3b09mRml2ZVJlYWRlcjtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5fZmluZFBhdHRlcm4gPSBmdW5jdGlvbihwYXR0ZXJuLCBvZmZzZXQsIGlzV2hpdGUsIHRyeUhhcmRlcikge1xuICAgIHZhciBjb3VudGVyID0gW10sXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBpLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBqLFxuICAgICAgICBzdW0sXG4gICAgICAgIGVwc2lsb24gPSBzZWxmLkFWR19DT0RFX0VSUk9SO1xuXG4gICAgaXNXaGl0ZSA9IGlzV2hpdGUgfHwgZmFsc2U7XG4gICAgdHJ5SGFyZGVyID0gdHJ5SGFyZGVyIHx8IGZhbHNlO1xuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fbmV4dFNldChzZWxmLl9yb3cpO1xuICAgIH1cblxuICAgIGZvciAoIGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb3VudGVyW2ldID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKCBpID0gb2Zmc2V0OyBpIDwgc2VsZi5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNvdW50ZXJbal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHJ5SGFyZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aCAtIDI7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAyXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAxXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5fZmluZFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3JvdyksXG4gICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgbmFycm93QmFyV2lkdGggPSAxO1xuXG4gICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgc3RhcnRJbmZvID0gc2VsZi5fZmluZFBhdHRlcm4oc2VsZi5TVEFSVF9QQVRURVJOLCBvZmZzZXQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyBzdGFydFBhdHRlcm5MZW5ndGgpO1xuICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gc3RhcnRJbmZvLnN0YXJ0IC0gbmFycm93QmFyV2lkdGggKiA1O1xuICAgICAgICBpZiAobGVhZGluZ1doaXRlc3BhY2VTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbWF0Y2hSYW5nZShsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LCBzdGFydEluZm8uc3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgIH1cbn07XG5cblR3b09mRml2ZVJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSA9IGZ1bmN0aW9uKGVuZEluZm8pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZDtcblxuICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHNlbGYuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHNlbGYuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5fZmluZEVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgZW5kSW5mbyxcbiAgICAgICAgdG1wLFxuICAgICAgICBvZmZzZXQ7XG5cbiAgICBzZWxmLl9yb3cucmV2ZXJzZSgpO1xuICAgIG9mZnNldCA9IHNlbGYuX25leHRTZXQoc2VsZi5fcm93KTtcbiAgICBlbmRJbmZvID0gc2VsZi5fZmluZFBhdHRlcm4oc2VsZi5TVE9QX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgIHNlbGYuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICBpZiAoZW5kSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXZlcnNlIG51bWJlcnNcbiAgICB0bXAgPSBlbmRJbmZvLnN0YXJ0O1xuICAgIGVuZEluZm8uc3RhcnQgPSBzZWxmLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgZW5kSW5mby5lbmQgPSBzZWxmLl9yb3cubGVuZ3RoIC0gdG1wO1xuXG4gICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyBzZWxmLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xufTtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5fZGVjb2RlQ29kZSA9IGZ1bmN0aW9uKGNvdW50ZXIpIHtcbiAgICB2YXIgaixcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIHN1bSA9IDAsXG4gICAgICAgIG5vcm1hbGl6ZWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBlcHNpbG9uID0gc2VsZi5BVkdfQ09ERV9FUlJPUixcbiAgICAgICAgY29kZSxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH07XG5cbiAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3VtICs9IGNvdW50ZXJbal07XG4gICAgfVxuICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBzZWxmLkNPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICBlcnJvciA9IHNlbGYuX21hdGNoUGF0dGVybihjb3VudGVyLCBzZWxmLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJlc3RNYXRjaC5lcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICB9XG59O1xuXG5Ud29PZkZpdmVSZWFkZXIucHJvdG90eXBlLl9kZWNvZGVQYXlsb2FkID0gZnVuY3Rpb24oY291bnRlcnMsIHJlc3VsdCwgZGVjb2RlZENvZGVzKSB7XG4gICAgdmFyIGksXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBwb3MgPSAwLFxuICAgICAgICBjb3VudGVyTGVuZ3RoID0gY291bnRlcnMubGVuZ3RoLFxuICAgICAgICBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDBdLFxuICAgICAgICBjb2RlO1xuXG4gICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgICAgICAgY291bnRlcltpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLmJhclNwYWNlUmF0aW9bMF07XG4gICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBjb2RlID0gc2VsZi5fZGVjb2RlQ29kZShjb3VudGVyKTtcbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgKyBcIlwiKTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgfVxuICAgIHJldHVybiBjb2RlO1xufTtcblxuVHdvT2ZGaXZlUmVhZGVyLnByb3RvdHlwZS5fdmVyaWZ5Q291bnRlckxlbmd0aCA9IGZ1bmN0aW9uKGNvdW50ZXJzKSB7XG4gICAgcmV0dXJuIChjb3VudGVycy5sZW5ndGggJSAxMCA9PT0gMCk7XG59O1xuXG5Ud29PZkZpdmVSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhcnRJbmZvLFxuICAgICAgICBlbmRJbmZvLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgY29kZSxcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGRlY29kZWRDb2RlcyA9IFtdLFxuICAgICAgICBjb3VudGVycztcblxuICAgIHN0YXJ0SW5mbyA9IHNlbGYuX2ZpbmRTdGFydCgpO1xuICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgZW5kSW5mbyA9IHNlbGYuX2ZpbmRFbmQoKTtcbiAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY291bnRlcnMgPSBzZWxmLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgZmFsc2UpO1xuICAgIGlmICghc2VsZi5fdmVyaWZ5Q291bnRlckxlbmd0aChjb3VudGVycykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvZGUgPSBzZWxmLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZGVjb2RlZENvZGVzLnB1c2goZW5kSW5mbyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oXCJcIiksXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgIGVuZDogZW5kSW5mby5lbmQsXG4gICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICBkZWNvZGVkQ29kZXM6IGRlY29kZWRDb2Rlc1xuICAgIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUd29PZkZpdmVSZWFkZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhZGVyLzJvZjVfcmVhZGVyLmpzIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIgZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmZ1bmN0aW9uIENvZGFiYXJSZWFkZXIoKSB7XG4gICAgQmFyY29kZVJlYWRlci5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX2NvdW50ZXJzID0gW107XG59XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICAgIEFMUEhBQkVUSF9TVFJJTkc6IHt2YWx1ZTogXCIwMTIzNDU2Nzg5LSQ6Ly4rQUJDRFwifSxcbiAgICBBTFBIQUJFVDoge3ZhbHVlOiBbNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQ1LCAzNiwgNTgsIDQ3LCA0NiwgNDMsIDY1LCA2NiwgNjcsIDY4XX0sXG4gICAgQ0hBUkFDVEVSX0VOQ09ESU5HUzoge3ZhbHVlOiBbMHgwMDMsIDB4MDA2LCAweDAwOSwgMHgwNjAsIDB4MDEyLCAweDA0MiwgMHgwMjEsIDB4MDI0LCAweDAzMCwgMHgwNDgsIDB4MDBjLCAweDAxOCxcbiAgICAgICAgMHgwNDUsIDB4MDUxLCAweDA1NCwgMHgwMTUsIDB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFXX0sXG4gICAgU1RBUlRfRU5EOiB7dmFsdWU6IFsweDAxQSwgMHgwMjksIDB4MDBCLCAweDAwRV19LFxuICAgIE1JTl9FTkNPREVEX0NIQVJTOiB7dmFsdWU6IDR9LFxuICAgIE1BWF9BQ0NFUFRBQkxFOiB7dmFsdWU6IDIuMH0sXG4gICAgUEFERElORzoge3ZhbHVlOiAxLjV9LFxuICAgIEZPUk1BVDoge3ZhbHVlOiBcImNvZGFiYXJcIiwgd3JpdGVhYmxlOiBmYWxzZX1cbn07XG5cbkNvZGFiYXJSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCYXJjb2RlUmVhZGVyLnByb3RvdHlwZSwgcHJvcGVydGllcyk7XG5Db2RhYmFyUmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvZGFiYXJSZWFkZXI7XG5cbkNvZGFiYXJSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZGVjb2RlZENoYXIsXG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIG5leHRTdGFydCxcbiAgICAgICAgZW5kO1xuXG4gICAgdGhpcy5fY291bnRlcnMgPSBzZWxmLl9maWxsQ291bnRlcnMoKTtcbiAgICBzdGFydCA9IHNlbGYuX2ZpbmRTdGFydCgpO1xuICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG5leHRTdGFydCA9IHN0YXJ0LnN0YXJ0Q291bnRlcjtcblxuICAgIGRvIHtcbiAgICAgICAgcGF0dGVybiA9IHNlbGYuX3RvUGF0dGVybihuZXh0U3RhcnQpO1xuICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlY29kZWRDaGFyID0gc2VsZi5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGRlY29kZWRDaGFyIDwgMCl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgIG5leHRTdGFydCArPSA4O1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEgJiYgc2VsZi5faXNTdGFydEVuZChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChuZXh0U3RhcnQgPCBzZWxmLl9jb3VudGVycy5sZW5ndGgpO1xuXG4gICAgLy8gdmVyaWZ5IGVuZFxuICAgIGlmICgocmVzdWx0Lmxlbmd0aCAtIDIpIDwgc2VsZi5NSU5fRU5DT0RFRF9DSEFSUyB8fCAhc2VsZi5faXNTdGFydEVuZChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgZW5kIHdoaXRlIHNwYWNlXG4gICAgaWYgKCFzZWxmLl92ZXJpZnlXaGl0ZXNwYWNlKHN0YXJ0LnN0YXJ0Q291bnRlciwgbmV4dFN0YXJ0IC0gOCkpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuX3ZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgc3RhcnQuc3RhcnRDb3VudGVyKSl7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIG5leHRTdGFydCA9IG5leHRTdGFydCA+IHNlbGYuX2NvdW50ZXJzLmxlbmd0aCA/IHNlbGYuX2NvdW50ZXJzLmxlbmd0aCA6IG5leHRTdGFydDtcbiAgICBlbmQgPSBzdGFydC5zdGFydCArIHNlbGYuX3N1bUNvdW50ZXJzKHN0YXJ0LnN0YXJ0Q291bnRlciwgbmV4dFN0YXJ0IC0gOCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiByZXN1bHQuam9pbihcIlwiKSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0LnN0YXJ0LFxuICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgZGVjb2RlZENvZGVzOiByZXN1bHRcbiAgICB9O1xufTtcblxuQ29kYWJhclJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeVdoaXRlc3BhY2UgPSBmdW5jdGlvbihzdGFydENvdW50ZXIsIGVuZENvdW50ZXIpIHtcbiAgICBpZiAoKHN0YXJ0Q291bnRlciAtIDEgPD0gMClcbiAgICAgICAgICAgIHx8IHRoaXMuX2NvdW50ZXJzW3N0YXJ0Q291bnRlciAtIDFdID49ICh0aGlzLl9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKHN0YXJ0Q291bnRlcikgLyAyLjApKSB7XG4gICAgICAgIGlmICgoZW5kQ291bnRlciArIDggPj0gdGhpcy5fY291bnRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHx8IHRoaXMuX2NvdW50ZXJzW2VuZENvdW50ZXIgKyA3XSA+PSAodGhpcy5fY2FsY3VsYXRlUGF0dGVybkxlbmd0aChlbmRDb3VudGVyKSAvIDIuMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbkNvZGFiYXJSZWFkZXIucHJvdG90eXBlLl9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoID0gZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgdmFyIGksXG4gICAgICAgIHN1bSA9IDA7XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyA3OyBpKyspIHtcbiAgICAgICAgc3VtICs9IHRoaXMuX2NvdW50ZXJzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBzdW07XG59O1xuXG5Db2RhYmFyUmVhZGVyLnByb3RvdHlwZS5fdGhyZXNob2xkUmVzdWx0UGF0dGVybiA9IGZ1bmN0aW9uKHJlc3VsdCwgc3RhcnRDb3VudGVyKXtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGNhdGVnb3JpemF0aW9uID0ge1xuICAgICAgICAgICAgc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRX0sXG4gICAgICAgICAgICAgICAgd2lkZToge3NpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUV9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFyOiB7XG4gICAgICAgICAgICAgICAgbmFycm93OiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUV9LFxuICAgICAgICAgICAgICAgIHdpZGU6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAga2luZCxcbiAgICAgICAgY2F0LFxuICAgICAgICBpLFxuICAgICAgICBqLFxuICAgICAgICBwb3MgPSBzdGFydENvdW50ZXIsXG4gICAgICAgIHBhdHRlcm47XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgcGF0dGVybiA9IHNlbGYuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcbiAgICAgICAgZm9yIChqID0gNjsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGtpbmQgPSAoaiAmIDEpID09PSAyID8gY2F0ZWdvcml6YXRpb24uYmFyIDogY2F0ZWdvcml6YXRpb24uc3BhY2U7XG4gICAgICAgICAgICBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICBjYXQuc2l6ZSArPSBzZWxmLl9jb3VudGVyc1twb3MgKyBqXTtcbiAgICAgICAgICAgIGNhdC5jb3VudHMrKztcbiAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IDg7XG4gICAgfVxuXG4gICAgW1wic3BhY2VcIiwgXCJiYXJcIl0uZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIG5ld2tpbmQgPSBjYXRlZ29yaXphdGlvbltrZXldO1xuICAgICAgICBuZXdraW5kLndpZGUubWluID1cbiAgICAgICAgICAgIE1hdGguZmxvb3IoKG5ld2tpbmQubmFycm93LnNpemUgLyBuZXdraW5kLm5hcnJvdy5jb3VudHMgKyBuZXdraW5kLndpZGUuc2l6ZSAvIG5ld2tpbmQud2lkZS5jb3VudHMpIC8gMik7XG4gICAgICAgIG5ld2tpbmQubmFycm93Lm1heCA9IE1hdGguY2VpbChuZXdraW5kLndpZGUubWluKTtcbiAgICAgICAgbmV3a2luZC53aWRlLm1heCA9IE1hdGguY2VpbCgobmV3a2luZC53aWRlLnNpemUgKiBzZWxmLk1BWF9BQ0NFUFRBQkxFICsgc2VsZi5QQURESU5HKSAvIG5ld2tpbmQud2lkZS5jb3VudHMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhdGVnb3JpemF0aW9uO1xufTtcblxuQ29kYWJhclJlYWRlci5wcm90b3R5cGUuX2NoYXJUb1BhdHRlcm4gPSBmdW5jdGlvbihjaGFyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLkFMUEhBQkVULmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLkFMUEhBQkVUW2ldID09PSBjaGFyQ29kZSl7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5DSEFSQUNURVJfRU5DT0RJTkdTW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAweDA7XG59O1xuXG5Db2RhYmFyUmVhZGVyLnByb3RvdHlwZS5fdmFsaWRhdGVSZXN1bHQgPSBmdW5jdGlvbihyZXN1bHQsIHN0YXJ0Q291bnRlcikge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgdGhyZXNob2xkcyA9IHNlbGYuX3RocmVzaG9sZFJlc3VsdFBhdHRlcm4ocmVzdWx0LCBzdGFydENvdW50ZXIpLFxuICAgICAgICBpLFxuICAgICAgICBqLFxuICAgICAgICBraW5kLFxuICAgICAgICBjYXQsXG4gICAgICAgIHNpemUsXG4gICAgICAgIHBvcyA9IHN0YXJ0Q291bnRlcixcbiAgICAgICAgcGF0dGVybjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGF0dGVybiA9IHNlbGYuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcbiAgICAgICAgZm9yIChqID0gNjsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGtpbmQgPSAoaiAmIDEpID09PSAwID8gdGhyZXNob2xkcy5iYXIgOiB0aHJlc2hvbGRzLnNwYWNlO1xuICAgICAgICAgICAgY2F0ID0gKHBhdHRlcm4gJiAxKSA9PT0gMSA/IGtpbmQud2lkZSA6IGtpbmQubmFycm93O1xuICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgaWYgKHNpemUgPCBjYXQubWluIHx8IHNpemUgPiBjYXQubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0dGVybiA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gODtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5Db2RhYmFyUmVhZGVyLnByb3RvdHlwZS5fcGF0dGVyblRvQ2hhciA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgICB2YXIgaSxcbiAgICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi5DSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLkNIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHNlbGYuQUxQSEFCRVRbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn07XG5cbkNvZGFiYXJSZWFkZXIucHJvdG90eXBlLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQgPSBmdW5jdGlvbihvZmZzZXQsIGVuZCkge1xuICAgIHZhciBpLFxuICAgICAgICBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBtYXggPSAwLFxuICAgICAgICBjb3VudGVyO1xuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgZW5kOyBpICs9IDIpe1xuICAgICAgICBjb3VudGVyID0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgIGlmIChjb3VudGVyID4gbWF4KSB7XG4gICAgICAgICAgICBtYXggPSBjb3VudGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudGVyIDwgbWluKSB7XG4gICAgICAgICAgICBtaW4gPSBjb3VudGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICgobWluICsgbWF4KSAvIDIuMCkgfCAwO1xufTtcblxuQ29kYWJhclJlYWRlci5wcm90b3R5cGUuX3RvUGF0dGVybiA9IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgIHZhciBudW1Db3VudGVycyA9IDcsXG4gICAgICAgIGVuZCA9IG9mZnNldCArIG51bUNvdW50ZXJzLFxuICAgICAgICBiYXJUaHJlc2hvbGQsXG4gICAgICAgIHNwYWNlVGhyZXNob2xkLFxuICAgICAgICBiaXRtYXNrID0gMSA8PCAobnVtQ291bnRlcnMgLSAxKSxcbiAgICAgICAgcGF0dGVybiA9IDAsXG4gICAgICAgIGksXG4gICAgICAgIHRocmVzaG9sZDtcblxuICAgIGlmIChlbmQgPiB0aGlzLl9jb3VudGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGJhclRocmVzaG9sZCA9IHRoaXMuX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQsIGVuZCk7XG4gICAgc3BhY2VUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0ICsgMSwgZW5kKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKXtcbiAgICAgICAgdGhyZXNob2xkID0gKGkgJiAxKSA9PT0gMCA/IGJhclRocmVzaG9sZCA6IHNwYWNlVGhyZXNob2xkO1xuICAgICAgICBpZiAodGhpcy5fY291bnRlcnNbb2Zmc2V0ICsgaV0gPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHBhdHRlcm4gfD0gYml0bWFzaztcbiAgICAgICAgfVxuICAgICAgICBiaXRtYXNrID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiBwYXR0ZXJuO1xufTtcblxuQ29kYWJhclJlYWRlci5wcm90b3R5cGUuX2lzU3RhcnRFbmQgPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TVEFSVF9FTkQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuU1RBUlRfRU5EW2ldID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5Db2RhYmFyUmVhZGVyLnByb3RvdHlwZS5fc3VtQ291bnRlcnMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgdmFyIGksXG4gICAgICAgIHN1bSA9IDA7XG5cbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn07XG5cbkNvZGFiYXJSZWFkZXIucHJvdG90eXBlLl9maW5kU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGksXG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHN0YXJ0ID0gc2VsZi5fbmV4dFVuc2V0KHNlbGYuX3JvdyksXG4gICAgICAgIGVuZDtcblxuICAgIGZvciAoaSA9IDE7IGkgPCB0aGlzLl9jb3VudGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXR0ZXJuID0gc2VsZi5fdG9QYXR0ZXJuKGkpO1xuICAgICAgICBpZiAocGF0dGVybiAhPT0gLTEgJiYgc2VsZi5faXNTdGFydEVuZChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogTG9vayBmb3Igd2hpdGVzcGFjZSBhaGVhZFxuICAgICAgICAgICAgc3RhcnQgKz0gc2VsZi5fc3VtQ291bnRlcnMoMCwgaSk7XG4gICAgICAgICAgICBlbmQgPSBzdGFydCArIHNlbGYuX3N1bUNvdW50ZXJzKGksIGkgKyA4KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogZW5kLFxuICAgICAgICAgICAgICAgIHN0YXJ0Q291bnRlcjogaSxcbiAgICAgICAgICAgICAgICBlbmRDb3VudGVyOiBpICsgOFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvZGFiYXJSZWFkZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhZGVyL2NvZGFiYXJfcmVhZGVyLmpzIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIgZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmZ1bmN0aW9uIENvZGUxMjhSZWFkZXIoKSB7XG4gICAgQmFyY29kZVJlYWRlci5jYWxsKHRoaXMpO1xufVxuXG52YXIgcHJvcGVydGllcyA9IHtcbiAgICBDT0RFX1NISUZUOiB7dmFsdWU6IDk4fSxcbiAgICBDT0RFX0M6IHt2YWx1ZTogOTl9LFxuICAgIENPREVfQjoge3ZhbHVlOiAxMDB9LFxuICAgIENPREVfQToge3ZhbHVlOiAxMDF9LFxuICAgIFNUQVJUX0NPREVfQToge3ZhbHVlOiAxMDN9LFxuICAgIFNUQVJUX0NPREVfQjoge3ZhbHVlOiAxMDR9LFxuICAgIFNUQVJUX0NPREVfQzoge3ZhbHVlOiAxMDV9LFxuICAgIFNUT1BfQ09ERToge3ZhbHVlOiAxMDZ9LFxuICAgIENPREVfUEFUVEVSTjoge3ZhbHVlOiBbXG4gICAgICAgIFsyLCAxLCAyLCAyLCAyLCAyXSxcbiAgICAgICAgWzIsIDIsIDIsIDEsIDIsIDJdLFxuICAgICAgICBbMiwgMiwgMiwgMiwgMiwgMV0sXG4gICAgICAgIFsxLCAyLCAxLCAyLCAyLCAzXSxcbiAgICAgICAgWzEsIDIsIDEsIDMsIDIsIDJdLFxuICAgICAgICBbMSwgMywgMSwgMiwgMiwgMl0sXG4gICAgICAgIFsxLCAyLCAyLCAyLCAxLCAzXSxcbiAgICAgICAgWzEsIDIsIDIsIDMsIDEsIDJdLFxuICAgICAgICBbMSwgMywgMiwgMiwgMSwgMl0sXG4gICAgICAgIFsyLCAyLCAxLCAyLCAxLCAzXSxcbiAgICAgICAgWzIsIDIsIDEsIDMsIDEsIDJdLFxuICAgICAgICBbMiwgMywgMSwgMiwgMSwgMl0sXG4gICAgICAgIFsxLCAxLCAyLCAyLCAzLCAyXSxcbiAgICAgICAgWzEsIDIsIDIsIDEsIDMsIDJdLFxuICAgICAgICBbMSwgMiwgMiwgMiwgMywgMV0sXG4gICAgICAgIFsxLCAxLCAzLCAyLCAyLCAyXSxcbiAgICAgICAgWzEsIDIsIDMsIDEsIDIsIDJdLFxuICAgICAgICBbMSwgMiwgMywgMiwgMiwgMV0sXG4gICAgICAgIFsyLCAyLCAzLCAyLCAxLCAxXSxcbiAgICAgICAgWzIsIDIsIDEsIDEsIDMsIDJdLFxuICAgICAgICBbMiwgMiwgMSwgMiwgMywgMV0sXG4gICAgICAgIFsyLCAxLCAzLCAyLCAxLCAyXSxcbiAgICAgICAgWzIsIDIsIDMsIDEsIDEsIDJdLFxuICAgICAgICBbMywgMSwgMiwgMSwgMywgMV0sXG4gICAgICAgIFszLCAxLCAxLCAyLCAyLCAyXSxcbiAgICAgICAgWzMsIDIsIDEsIDEsIDIsIDJdLFxuICAgICAgICBbMywgMiwgMSwgMiwgMiwgMV0sXG4gICAgICAgIFszLCAxLCAyLCAyLCAxLCAyXSxcbiAgICAgICAgWzMsIDIsIDIsIDEsIDEsIDJdLFxuICAgICAgICBbMywgMiwgMiwgMiwgMSwgMV0sXG4gICAgICAgIFsyLCAxLCAyLCAxLCAyLCAzXSxcbiAgICAgICAgWzIsIDEsIDIsIDMsIDIsIDFdLFxuICAgICAgICBbMiwgMywgMiwgMSwgMiwgMV0sXG4gICAgICAgIFsxLCAxLCAxLCAzLCAyLCAzXSxcbiAgICAgICAgWzEsIDMsIDEsIDEsIDIsIDNdLFxuICAgICAgICBbMSwgMywgMSwgMywgMiwgMV0sXG4gICAgICAgIFsxLCAxLCAyLCAzLCAxLCAzXSxcbiAgICAgICAgWzEsIDMsIDIsIDEsIDEsIDNdLFxuICAgICAgICBbMSwgMywgMiwgMywgMSwgMV0sXG4gICAgICAgIFsyLCAxLCAxLCAzLCAxLCAzXSxcbiAgICAgICAgWzIsIDMsIDEsIDEsIDEsIDNdLFxuICAgICAgICBbMiwgMywgMSwgMywgMSwgMV0sXG4gICAgICAgIFsxLCAxLCAyLCAxLCAzLCAzXSxcbiAgICAgICAgWzEsIDEsIDIsIDMsIDMsIDFdLFxuICAgICAgICBbMSwgMywgMiwgMSwgMywgMV0sXG4gICAgICAgIFsxLCAxLCAzLCAxLCAyLCAzXSxcbiAgICAgICAgWzEsIDEsIDMsIDMsIDIsIDFdLFxuICAgICAgICBbMSwgMywgMywgMSwgMiwgMV0sXG4gICAgICAgIFszLCAxLCAzLCAxLCAyLCAxXSxcbiAgICAgICAgWzIsIDEsIDEsIDMsIDMsIDFdLFxuICAgICAgICBbMiwgMywgMSwgMSwgMywgMV0sXG4gICAgICAgIFsyLCAxLCAzLCAxLCAxLCAzXSxcbiAgICAgICAgWzIsIDEsIDMsIDMsIDEsIDFdLFxuICAgICAgICBbMiwgMSwgMywgMSwgMywgMV0sXG4gICAgICAgIFszLCAxLCAxLCAxLCAyLCAzXSxcbiAgICAgICAgWzMsIDEsIDEsIDMsIDIsIDFdLFxuICAgICAgICBbMywgMywgMSwgMSwgMiwgMV0sXG4gICAgICAgIFszLCAxLCAyLCAxLCAxLCAzXSxcbiAgICAgICAgWzMsIDEsIDIsIDMsIDEsIDFdLFxuICAgICAgICBbMywgMywgMiwgMSwgMSwgMV0sXG4gICAgICAgIFszLCAxLCA0LCAxLCAxLCAxXSxcbiAgICAgICAgWzIsIDIsIDEsIDQsIDEsIDFdLFxuICAgICAgICBbNCwgMywgMSwgMSwgMSwgMV0sXG4gICAgICAgIFsxLCAxLCAxLCAyLCAyLCA0XSxcbiAgICAgICAgWzEsIDEsIDEsIDQsIDIsIDJdLFxuICAgICAgICBbMSwgMiwgMSwgMSwgMiwgNF0sXG4gICAgICAgIFsxLCAyLCAxLCA0LCAyLCAxXSxcbiAgICAgICAgWzEsIDQsIDEsIDEsIDIsIDJdLFxuICAgICAgICBbMSwgNCwgMSwgMiwgMiwgMV0sXG4gICAgICAgIFsxLCAxLCAyLCAyLCAxLCA0XSxcbiAgICAgICAgWzEsIDEsIDIsIDQsIDEsIDJdLFxuICAgICAgICBbMSwgMiwgMiwgMSwgMSwgNF0sXG4gICAgICAgIFsxLCAyLCAyLCA0LCAxLCAxXSxcbiAgICAgICAgWzEsIDQsIDIsIDEsIDEsIDJdLFxuICAgICAgICBbMSwgNCwgMiwgMiwgMSwgMV0sXG4gICAgICAgIFsyLCA0LCAxLCAyLCAxLCAxXSxcbiAgICAgICAgWzIsIDIsIDEsIDEsIDEsIDRdLFxuICAgICAgICBbNCwgMSwgMywgMSwgMSwgMV0sXG4gICAgICAgIFsyLCA0LCAxLCAxLCAxLCAyXSxcbiAgICAgICAgWzEsIDMsIDQsIDEsIDEsIDFdLFxuICAgICAgICBbMSwgMSwgMSwgMiwgNCwgMl0sXG4gICAgICAgIFsxLCAyLCAxLCAxLCA0LCAyXSxcbiAgICAgICAgWzEsIDIsIDEsIDIsIDQsIDFdLFxuICAgICAgICBbMSwgMSwgNCwgMiwgMSwgMl0sXG4gICAgICAgIFsxLCAyLCA0LCAxLCAxLCAyXSxcbiAgICAgICAgWzEsIDIsIDQsIDIsIDEsIDFdLFxuICAgICAgICBbNCwgMSwgMSwgMiwgMSwgMl0sXG4gICAgICAgIFs0LCAyLCAxLCAxLCAxLCAyXSxcbiAgICAgICAgWzQsIDIsIDEsIDIsIDEsIDFdLFxuICAgICAgICBbMiwgMSwgMiwgMSwgNCwgMV0sXG4gICAgICAgIFsyLCAxLCA0LCAxLCAyLCAxXSxcbiAgICAgICAgWzQsIDEsIDIsIDEsIDIsIDFdLFxuICAgICAgICBbMSwgMSwgMSwgMSwgNCwgM10sXG4gICAgICAgIFsxLCAxLCAxLCAzLCA0LCAxXSxcbiAgICAgICAgWzEsIDMsIDEsIDEsIDQsIDFdLFxuICAgICAgICBbMSwgMSwgNCwgMSwgMSwgM10sXG4gICAgICAgIFsxLCAxLCA0LCAzLCAxLCAxXSxcbiAgICAgICAgWzQsIDEsIDEsIDEsIDEsIDNdLFxuICAgICAgICBbNCwgMSwgMSwgMywgMSwgMV0sXG4gICAgICAgIFsxLCAxLCAzLCAxLCA0LCAxXSxcbiAgICAgICAgWzEsIDEsIDQsIDEsIDMsIDFdLFxuICAgICAgICBbMywgMSwgMSwgMSwgNCwgMV0sXG4gICAgICAgIFs0LCAxLCAxLCAxLCAzLCAxXSxcbiAgICAgICAgWzIsIDEsIDEsIDQsIDEsIDJdLFxuICAgICAgICBbMiwgMSwgMSwgMiwgMSwgNF0sXG4gICAgICAgIFsyLCAxLCAxLCAyLCAzLCAyXSxcbiAgICAgICAgWzIsIDMsIDMsIDEsIDEsIDEsIDJdXG4gICAgXX0sXG4gICAgU0lOR0xFX0NPREVfRVJST1I6IHt2YWx1ZTogMC42NH0sXG4gICAgQVZHX0NPREVfRVJST1I6IHt2YWx1ZTogMC4zMH0sXG4gICAgRk9STUFUOiB7dmFsdWU6IFwiY29kZV8xMjhcIiwgd3JpdGVhYmxlOiBmYWxzZX0sXG4gICAgTU9EVUxFX0lORElDRVM6IHt2YWx1ZToge2JhcjogWzAsIDIsIDRdLCBzcGFjZTogWzEsIDMsIDVdfX1cbn07XG5cbkNvZGUxMjhSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCYXJjb2RlUmVhZGVyLnByb3RvdHlwZSwgcHJvcGVydGllcyk7XG5Db2RlMTI4UmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvZGUxMjhSZWFkZXI7XG5cbkNvZGUxMjhSZWFkZXIucHJvdG90eXBlLl9kZWNvZGVDb2RlID0gZnVuY3Rpb24oc3RhcnQsIGNvcnJlY3Rpb24pIHtcbiAgICB2YXIgY291bnRlciA9IFswLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgaSxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIG9mZnNldCA9IHN0YXJ0LFxuICAgICAgICBpc1doaXRlID0gIXNlbGYuX3Jvd1tvZmZzZXRdLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnQsXG4gICAgICAgICAgICBjb3JyZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgYmFyOiAxLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGVycm9yO1xuXG4gICAgZm9yICggaSA9IG9mZnNldDsgaSA8IHNlbGYuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChjb3JyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvcnJlY3QoY291bnRlciwgY29ycmVjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBzZWxmLkNPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX21hdGNoUGF0dGVybihjb3VudGVyLCBzZWxmLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5jb2RlID09PSAtMSB8fCBiZXN0TWF0Y2guZXJyb3IgPiBzZWxmLkFWR19DT0RFX0VSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IGNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1PRFVMRV9JTkRJQ0VTLmJhcik7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLnNwYWNlID0gY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkNvZGUxMjhSZWFkZXIucHJvdG90eXBlLl9jb3JyZWN0ID0gZnVuY3Rpb24oY291bnRlciwgY29ycmVjdGlvbikge1xuICAgIHRoaXMuX2NvcnJlY3RCYXJzKGNvdW50ZXIsIGNvcnJlY3Rpb24uYmFyLCB0aGlzLk1PRFVMRV9JTkRJQ0VTLmJhcik7XG4gICAgdGhpcy5fY29ycmVjdEJhcnMoY291bnRlciwgY29ycmVjdGlvbi5zcGFjZSwgdGhpcy5NT0RVTEVfSU5ESUNFUy5zcGFjZSk7XG59O1xuXG5Db2RlMTI4UmVhZGVyLnByb3RvdHlwZS5fZmluZFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvdW50ZXIgPSBbMCwgMCwgMCwgMCwgMCwgMF0sXG4gICAgICAgIGksXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3JvdyksXG4gICAgICAgIGlzV2hpdGUgPSBmYWxzZSxcbiAgICAgICAgY291bnRlclBvcyA9IDAsXG4gICAgICAgIGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29kZSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGosXG4gICAgICAgIHN1bTtcblxuICAgIGZvciAoIGkgPSBvZmZzZXQ7IGkgPCBzZWxmLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgY291bnRlci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY291bnRlcltqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb2RlID0gc2VsZi5TVEFSVF9DT0RFX0E7IGNvZGUgPD0gc2VsZi5TVEFSVF9DT0RFX0M7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX21hdGNoUGF0dGVybihjb3VudGVyLCBzZWxmLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciA8IHNlbGYuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIHN1bTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IGNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1PRFVMRV9JTkRJQ0VTLmJhcik7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLnNwYWNlID0gY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcls0XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkNvZGUxMjhSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHN0YXJ0SW5mbyA9IHNlbGYuX2ZpbmRTdGFydCgpLFxuICAgICAgICBjb2RlID0gbnVsbCxcbiAgICAgICAgZG9uZSA9IGZhbHNlLFxuICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgbXVsdGlwbGllciA9IDAsXG4gICAgICAgIGNoZWNrc3VtID0gMCxcbiAgICAgICAgY29kZXNldCxcbiAgICAgICAgcmF3UmVzdWx0ID0gW10sXG4gICAgICAgIGRlY29kZWRDb2RlcyA9IFtdLFxuICAgICAgICBzaGlmdE5leHQgPSBmYWxzZSxcbiAgICAgICAgdW5zaGlmdCxcbiAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG5cbiAgICBpZiAoc3RhcnRJbmZvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb2RlID0ge1xuICAgICAgICBjb2RlOiBzdGFydEluZm8uY29kZSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgZW5kOiBzdGFydEluZm8uZW5kLFxuICAgICAgICBjb3JyZWN0aW9uOiB7XG4gICAgICAgICAgICBiYXI6IHN0YXJ0SW5mby5jb3JyZWN0aW9uLmJhcixcbiAgICAgICAgICAgIHNwYWNlOiBzdGFydEluZm8uY29ycmVjdGlvbi5zcGFjZVxuICAgICAgICB9XG4gICAgfTtcbiAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICBjaGVja3N1bSA9IGNvZGUuY29kZTtcbiAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgIGNhc2Ugc2VsZi5TVEFSVF9DT0RFX0E6XG4gICAgICAgIGNvZGVzZXQgPSBzZWxmLkNPREVfQTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSBzZWxmLlNUQVJUX0NPREVfQjpcbiAgICAgICAgY29kZXNldCA9IHNlbGYuQ09ERV9CO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlIHNlbGYuU1RBUlRfQ09ERV9DOlxuICAgICAgICBjb2Rlc2V0ID0gc2VsZi5DT0RFX0M7XG4gICAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICBzaGlmdE5leHQgPSBmYWxzZTtcbiAgICAgICAgY29kZSA9IHNlbGYuX2RlY29kZUNvZGUoY29kZS5lbmQsIGNvZGUuY29ycmVjdGlvbik7XG4gICAgICAgIGlmIChjb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBzZWxmLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBzZWxmLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgIHJhd1Jlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgICAgICAgICAgbXVsdGlwbGllcisrO1xuICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9IG11bHRpcGxpZXIgKiBjb2RlLmNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChjb2Rlc2V0KSB7XG4gICAgICAgICAgICBjYXNlIHNlbGYuQ09ERV9BOlxuICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPCA2NCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlLmNvZGUgPCA5Nikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUuY29kZSAtIDY0KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gc2VsZi5TVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbGYuQ09ERV9TSElGVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0TmV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gc2VsZi5DT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWxmLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBzZWxmLkNPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbGYuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHNlbGYuQ09ERV9DO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2VsZi5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBzZWxmLkNPREVfQjpcbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlIDwgOTYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgzMiArIGNvZGUuY29kZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IHNlbGYuU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWxmLkNPREVfU0hJRlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHNlbGYuQ09ERV9BO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2VsZi5DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gc2VsZi5DT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWxmLkNPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBzZWxmLkNPREVfQztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbGYuU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc2VsZi5DT0RFX0M6XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgPCAxMCA/IFwiMFwiICsgY29kZS5jb2RlIDogY29kZS5jb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBzZWxmLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2VsZi5DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gc2VsZi5DT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWxmLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBzZWxmLkNPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbGYuU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bnNoaWZ0KSB7XG4gICAgICAgICAgICBjb2Rlc2V0ID0gY29kZXNldCA9PT0gc2VsZi5DT0RFX0EgPyBzZWxmLkNPREVfQiA6IHNlbGYuQ09ERV9BO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29kZS5lbmQgPSBzZWxmLl9uZXh0VW5zZXQoc2VsZi5fcm93LCBjb2RlLmVuZCk7XG4gICAgaWYgKCFzZWxmLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoY29kZSkpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjaGVja3N1bSAtPSBtdWx0aXBsaWVyICogcmF3UmVzdWx0W3Jhd1Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICBpZiAoY2hlY2tzdW0gJSAxMDMgIT09IHJhd1Jlc3VsdFtyYXdSZXN1bHQubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBsYXN0IGNvZGUgZnJvbSByZXN1bHQgKGNoZWNrc3VtKVxuICAgIGlmIChyZW1vdmVMYXN0Q2hhcmFjdGVyKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UocmVzdWx0Lmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oXCJcIiksXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgIGVuZDogY29kZS5lbmQsXG4gICAgICAgIGNvZGVzZXQ6IGNvZGVzZXQsXG4gICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICBkZWNvZGVkQ29kZXM6IGRlY29kZWRDb2RlcyxcbiAgICAgICAgZW5kSW5mbzogY29kZVxuICAgIH07XG59O1xuXG5cbkJhcmNvZGVSZWFkZXIucHJvdG90eXBlLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UgPSBmdW5jdGlvbihlbmRJbmZvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQ7XG5cbiAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArICgoZW5kSW5mby5lbmQgLSBlbmRJbmZvLnN0YXJ0KSAvIDIpO1xuICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCBzZWxmLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgIGlmIChzZWxmLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUNvcnJlY3Rpb24oZXhwZWN0ZWQsIG5vcm1hbGl6ZWQsIGluZGljZXMpIHtcbiAgICB2YXIgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIHN1bU5vcm1hbGl6ZWQgPSAwLFxuICAgICAgICBzdW1FeHBlY3RlZCA9IDA7XG5cbiAgICB3aGlsZShsZW5ndGgtLSkge1xuICAgICAgICBzdW1FeHBlY3RlZCArPSBleHBlY3RlZFtpbmRpY2VzW2xlbmd0aF1dO1xuICAgICAgICBzdW1Ob3JtYWxpemVkICs9IG5vcm1hbGl6ZWRbaW5kaWNlc1tsZW5ndGhdXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bUV4cGVjdGVkL3N1bU5vcm1hbGl6ZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUxMjhSZWFkZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhZGVyL2NvZGVfMTI4X3JlYWRlci5qcyIsImltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi9jb2RlXzM5X3JlYWRlcic7XG5cbmZ1bmN0aW9uIENvZGUzOVZJTlJlYWRlcigpIHtcbiAgICBDb2RlMzlSZWFkZXIuY2FsbCh0aGlzKTtcbn1cblxudmFyIHBhdHRlcm5zID0ge1xuICAgIElPUTogL1tJT1FdL2csXG4gICAgQVowOTogL1tBLVowLTldezE3fS9cbn07XG5cbkNvZGUzOVZJTlJlYWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvZGUzOVJlYWRlci5wcm90b3R5cGUpO1xuQ29kZTM5VklOUmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvZGUzOVZJTlJlYWRlcjtcblxuLy8gQ3JpYmJlZCBmcm9tOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3p4aW5nL3p4aW5nL2Jsb2IvbWFzdGVyL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3p4aW5nL2NsaWVudC9yZXN1bHQvVklOUmVzdWx0UGFyc2VyLmphdmFcbkNvZGUzOVZJTlJlYWRlci5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSBDb2RlMzlSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUuYXBwbHkodGhpcyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGNvZGUgPSByZXN1bHQuY29kZTtcblxuICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb2RlID0gY29kZS5yZXBsYWNlKHBhdHRlcm5zLklPUSwgJycpO1xuXG4gICAgaWYgKCFjb2RlLm1hdGNoKHBhdHRlcm5zLkFaMDkpKSB7XG4gICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgQVowOSBwYXR0ZXJuIGNvZGU6JywgY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jaGVja0NoZWNrc3VtKGNvZGUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuQ29kZTM5VklOUmVhZGVyLnByb3RvdHlwZS5fY2hlY2tDaGVja3N1bSA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAvLyBUT0RPXG4gICAgcmV0dXJuICEhY29kZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUzOVZJTlJlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvY29kZV8zOV92aW5fcmVhZGVyLmpzIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIgZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5cbmZ1bmN0aW9uIENvZGU5M1JlYWRlcigpIHtcbiAgICBCYXJjb2RlUmVhZGVyLmNhbGwodGhpcyk7XG59XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICQvKyVhYmNkKlwiO1xuXG52YXIgcHJvcGVydGllcyA9IHtcbiAgICBBTFBIQUJFVEhfU1RSSU5HOiB7dmFsdWU6IEFMUEhBQkVUSF9TVFJJTkd9LFxuICAgIEFMUEhBQkVUOiB7dmFsdWU6IEFMUEhBQkVUSF9TVFJJTkcuc3BsaXQoJycpLm1hcChjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSl9LFxuICAgIENIQVJBQ1RFUl9FTkNPRElOR1M6IHt2YWx1ZTogW1xuICAgICAgICAweDExNCwgMHgxNDgsIDB4MTQ0LCAweDE0MiwgMHgxMjgsIDB4MTI0LCAweDEyMiwgMHgxNTAsIDB4MTEyLCAweDEwQSxcbiAgICAgICAgMHgxQTgsIDB4MUE0LCAweDFBMiwgMHgxOTQsIDB4MTkyLCAweDE4QSwgMHgxNjgsIDB4MTY0LCAweDE2MiwgMHgxMzQsXG4gICAgICAgIDB4MTFBLCAweDE1OCwgMHgxNEMsIDB4MTQ2LCAweDEyQywgMHgxMTYsIDB4MUI0LCAweDFCMiwgMHgxQUMsIDB4MUE2LFxuICAgICAgICAweDE5NiwgMHgxOUEsIDB4MTZDLCAweDE2NiwgMHgxMzYsIDB4MTNBLCAweDEyRSwgMHgxRDQsIDB4MUQyLCAweDFDQSxcbiAgICAgICAgMHgxNkUsIDB4MTc2LCAweDFBRSwgMHgxMjYsIDB4MURBLCAweDFENiwgMHgxMzIsIDB4MTVFXG4gICAgXX0sXG4gICAgQVNURVJJU0s6IHt2YWx1ZTogMHgxNUV9LFxuICAgIEZPUk1BVDoge3ZhbHVlOiBcImNvZGVfOTNcIiwgd3JpdGVhYmxlOiBmYWxzZX1cbn07XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJhcmNvZGVSZWFkZXIucHJvdG90eXBlLCBwcm9wZXJ0aWVzKTtcbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb2RlOTNSZWFkZXI7XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgY291bnRlcnMgPSBbMCwgMCwgMCwgMCwgMCwgMF0sXG4gICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICBzdGFydCA9IHNlbGYuX2ZpbmRTdGFydCgpLFxuICAgICAgICBkZWNvZGVkQ2hhcixcbiAgICAgICAgbGFzdFN0YXJ0LFxuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBuZXh0U3RhcnQ7XG5cbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBuZXh0U3RhcnQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3Jvdywgc3RhcnQuZW5kKTtcblxuICAgIGRvIHtcbiAgICAgICAgY291bnRlcnMgPSBzZWxmLl90b0NvdW50ZXJzKG5leHRTdGFydCwgY291bnRlcnMpO1xuICAgICAgICBwYXR0ZXJuID0gc2VsZi5fdG9QYXR0ZXJuKGNvdW50ZXJzKTtcbiAgICAgICAgaWYgKHBhdHRlcm4gPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVkQ2hhciA9IHNlbGYuX3BhdHRlcm5Ub0NoYXIocGF0dGVybik7XG4gICAgICAgIGlmIChkZWNvZGVkQ2hhciA8IDApe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7XG4gICAgICAgIG5leHRTdGFydCArPSBBcnJheUhlbHBlci5zdW0oY291bnRlcnMpO1xuICAgICAgICBuZXh0U3RhcnQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICB9IHdoaWxlIChkZWNvZGVkQ2hhciAhPT0gJyonKTtcbiAgICByZXN1bHQucG9wKCk7XG5cbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFzZWxmLl92ZXJpZnlFbmQobGFzdFN0YXJ0LCBuZXh0U3RhcnQsIGNvdW50ZXJzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuX3ZlcmlmeUNoZWNrc3VtcyhyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCByZXN1bHQubGVuZ3RoIC0gMik7XG4gICAgaWYgKChyZXN1bHQgPSBzZWxmLl9kZWNvZGVFeHRlbmRlZChyZXN1bHQpKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oXCJcIiksXG4gICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgZW5kOiBuZXh0U3RhcnQsXG4gICAgICAgIHN0YXJ0SW5mbzogc3RhcnQsXG4gICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgfTtcbn07XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuX3ZlcmlmeUVuZCA9IGZ1bmN0aW9uKGxhc3RTdGFydCwgbmV4dFN0YXJ0KSB7XG4gICAgaWYgKGxhc3RTdGFydCA9PT0gbmV4dFN0YXJ0IHx8ICF0aGlzLl9yb3dbbmV4dFN0YXJ0XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuQ29kZTkzUmVhZGVyLnByb3RvdHlwZS5fcGF0dGVyblRvQ2hhciA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgICB2YXIgaSxcbiAgICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi5DSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLkNIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHNlbGYuQUxQSEFCRVRbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn07XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuX3RvUGF0dGVybiA9IGZ1bmN0aW9uKGNvdW50ZXJzKSB7XG4gICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgbGV0IHBhdHRlcm4gPSAwO1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykge1xuICAgICAgICBzdW0gKz0gY291bnRlcnNbaV07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgIGxldCBub3JtYWxpemVkID0gTWF0aC5yb3VuZChjb3VudGVyc1tpXSAqIDkgLyBzdW0pO1xuICAgICAgICBpZiAobm9ybWFsaXplZCA8IDEgfHwgbm9ybWFsaXplZCA+IDQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGkgJiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxpemVkOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gKHBhdHRlcm4gPDwgMSkgfCAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0dGVybiA8PD0gbm9ybWFsaXplZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXR0ZXJuO1xufTtcblxuQ29kZTkzUmVhZGVyLnByb3RvdHlwZS5fZmluZFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl9uZXh0U2V0KHNlbGYuX3JvdyksXG4gICAgICAgIHBhdHRlcm5TdGFydCA9IG9mZnNldCxcbiAgICAgICAgY291bnRlciA9IFswLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgY291bnRlclBvcyA9IDAsXG4gICAgICAgIGlzV2hpdGUgPSBmYWxzZSxcbiAgICAgICAgaSxcbiAgICAgICAgaixcbiAgICAgICAgd2hpdGVTcGFjZU11c3RTdGFydDtcblxuICAgIGZvciAoIGkgPSBvZmZzZXQ7IGkgPCBzZWxmLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHN0YXJ0IHBhdHRlcm5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdG9QYXR0ZXJuKGNvdW50ZXIpID09PSBzZWxmLkFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2VNdXN0U3RhcnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIHBhdHRlcm5TdGFydCAtICgoaSAtIHBhdHRlcm5TdGFydCkgLyA0KSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwYXR0ZXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJbMF0gKyBjb3VudGVyWzFdO1xuICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcls0XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuX2RlY29kZUV4dGVuZGVkID0gZnVuY3Rpb24oY2hhckFycmF5KSB7XG4gICAgY29uc3QgbGVuZ3RoID0gY2hhckFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoYXIgPSBjaGFyQXJyYXlbaV07XG4gICAgICAgIGlmIChjaGFyID49ICdhJyAmJiBjaGFyIDw9ICdkJykge1xuICAgICAgICAgICAgaWYgKGkgPiAobGVuZ3RoIC0gMikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2hhckFycmF5WysraV07XG4gICAgICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBuZXh0Q2hhci5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgbGV0IGRlY29kZWRDaGFyO1xuICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlIC0gNjQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2InOlxuICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnRicgJiYgbmV4dENoYXIgPD0gJ0onKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAxMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnSycgJiYgbmV4dENoYXIgPD0gJ08nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgKyAxNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnUCcgJiYgbmV4dENoYXIgPD0gJ1MnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgKyA0Myk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnVCcgJiYgbmV4dENoYXIgPD0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ08nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA9PT0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gJzonO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgKyAzMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkNvZGU5M1JlYWRlci5wcm90b3R5cGUuX3ZlcmlmeUNoZWNrc3VtcyA9IGZ1bmN0aW9uKGNoYXJBcnJheSkge1xuICAgIHJldHVybiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAyLCAyMClcbiAgICAgICAgJiYgdGhpcy5fbWF0Y2hDaGVja0NoYXIoY2hhckFycmF5LCBjaGFyQXJyYXkubGVuZ3RoIC0gMSwgMTUpO1xufTtcblxuQ29kZTkzUmVhZGVyLnByb3RvdHlwZS5fbWF0Y2hDaGVja0NoYXIgPSBmdW5jdGlvbihjaGFyQXJyYXksIGluZGV4LCBtYXhXZWlnaHQpIHtcbiAgICBjb25zdCBhcnJheVRvQ2hlY2sgPSBjaGFyQXJyYXkuc2xpY2UoMCwgaW5kZXgpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5VG9DaGVjay5sZW5ndGg7XG4gICAgY29uc3Qgd2VpZ2h0ZWRTdW1zID0gYXJyYXlUb0NoZWNrLnJlZHVjZSgoc3VtLCBjaGFyLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHdlaWdodCA9ICgoKGkgKiAtMSkgKyAobGVuZ3RoIC0gMSkpICUgbWF4V2VpZ2h0KSArIDE7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5BTFBIQUJFVC5pbmRleE9mKGNoYXIuY2hhckNvZGVBdCgwKSk7XG4gICAgICAgIHJldHVybiBzdW0gKyAod2VpZ2h0ICogdmFsdWUpO1xuICAgIH0sIDApO1xuXG4gICAgY29uc3QgY2hlY2tDaGFyID0gdGhpcy5BTFBIQUJFVFsod2VpZ2h0ZWRTdW1zICUgNDcpXTtcbiAgICByZXR1cm4gY2hlY2tDaGFyID09PSBjaGFyQXJyYXlbaW5kZXhdLmNoYXJDb2RlQXQoMCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb2RlOTNSZWFkZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhZGVyL2NvZGVfOTNfcmVhZGVyLmpzIiwiaW1wb3J0IEVBTlJlYWRlciBmcm9tICcuL2Vhbl9yZWFkZXInO1xuXG5mdW5jdGlvbiBFQU4yUmVhZGVyKCkge1xuICAgIEVBTlJlYWRlci5jYWxsKHRoaXMpO1xufVxuXG52YXIgcHJvcGVydGllcyA9IHtcbiAgICBGT1JNQVQ6IHt2YWx1ZTogXCJlYW5fMlwiLCB3cml0ZWFibGU6IGZhbHNlfVxufTtcblxuRUFOMlJlYWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVBTlJlYWRlci5wcm90b3R5cGUsIHByb3BlcnRpZXMpO1xuRUFOMlJlYWRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFQU4yUmVhZGVyO1xuXG5FQU4yUmVhZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbihyb3csIHN0YXJ0KSB7XG4gICAgdGhpcy5fcm93ID0gcm93O1xuICAgIHZhciBjb3VudGVycyA9IFswLCAwLCAwLCAwXSxcbiAgICAgICAgY29kZUZyZXF1ZW5jeSA9IDAsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBvZmZzZXQgPSBzdGFydCxcbiAgICAgICAgZW5kID0gdGhpcy5fcm93Lmxlbmd0aCxcbiAgICAgICAgY29kZSxcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGRlY29kZWRDb2RlcyA9IFtdO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IDIgJiYgb2Zmc2V0IDwgZW5kOyBpKyspIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgcmVzdWx0LnB1c2goY29kZS5jb2RlICUgMTApO1xuICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDEgPDwgKDEgLSBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSAhPSAxKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN1bHQubGVuZ3RoICE9IDIgfHwgKHBhcnNlSW50KHJlc3VsdC5qb2luKFwiXCIpKSAlIDQpICAhPT0gY29kZUZyZXF1ZW5jeSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oXCJcIiksXG4gICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgZW5kOiBjb2RlLmVuZFxuICAgIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU4yUmVhZGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWRlci9lYW5fMl9yZWFkZXIuanMiLCJpbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5cbmZ1bmN0aW9uIEVBTjVSZWFkZXIoKSB7XG4gICAgRUFOUmVhZGVyLmNhbGwodGhpcyk7XG59XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICAgIEZPUk1BVDoge3ZhbHVlOiBcImVhbl81XCIsIHdyaXRlYWJsZTogZmFsc2V9XG59O1xuXG5jb25zdCBDSEVDS19ESUdJVF9FTkNPRElOR1MgPSBbMjQsIDIwLCAxOCwgMTcsIDEyLCA2LCAzLCAxMCwgOSwgNV07XG5cbkVBTjVSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFQU5SZWFkZXIucHJvdG90eXBlLCBwcm9wZXJ0aWVzKTtcbkVBTjVSZWFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRUFONVJlYWRlcjtcblxuRUFONVJlYWRlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24ocm93LCBzdGFydCkge1xuICAgIHRoaXMuX3JvdyA9IHJvdztcbiAgICB2YXIgY291bnRlcnMgPSBbMCwgMCwgMCwgMF0sXG4gICAgICAgIGNvZGVGcmVxdWVuY3kgPSAwLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgb2Zmc2V0ID0gc3RhcnQsXG4gICAgICAgIGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGgsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICBkZWNvZGVkQ29kZXMgPSBbXTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCA1ICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG9mZnNldCk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgaWYgKGNvZGUuY29kZSA+PSB0aGlzLkNPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg0IC0gaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgIT0gNCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIGNvZGUuZW5kKTtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3csIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPSA1KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChleHRlbnNpb25DaGVja3N1bShyZXN1bHQpICE9PSBkZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3kpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiByZXN1bHQuam9pbihcIlwiKSxcbiAgICAgICAgZGVjb2RlZENvZGVzLFxuICAgICAgICBlbmQ6IGNvZGUuZW5kXG4gICAgfTtcbn07XG5cbmZ1bmN0aW9uIGRldGVybWluZUNoZWNrRGlnaXQoY29kZUZyZXF1ZW5jeSkge1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDSEVDS19ESUdJVF9FTkNPRElOR1NbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbkNoZWNrc3VtKHJlc3VsdCkge1xuICAgIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgICBzdW0gPSAwLFxuICAgICAgICBpO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICB9XG4gICAgc3VtICo9IDM7XG4gICAgZm9yIChpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICB9XG4gICAgc3VtICo9IDM7XG4gICAgcmV0dXJuIHN1bSAlIDEwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBFQU41UmVhZGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWRlci9lYW5fNV9yZWFkZXIuanMiLCJpbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5cbmZ1bmN0aW9uIEVBTjhSZWFkZXIob3B0cywgc3VwcGxlbWVudHMpIHtcbiAgICBFQU5SZWFkZXIuY2FsbCh0aGlzLCBvcHRzLCBzdXBwbGVtZW50cyk7XG59XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICAgIEZPUk1BVDoge3ZhbHVlOiBcImVhbl84XCIsIHdyaXRlYWJsZTogZmFsc2V9XG59O1xuXG5FQU44UmVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRUFOUmVhZGVyLnByb3RvdHlwZSwgcHJvcGVydGllcyk7XG5FQU44UmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVBTjhSZWFkZXI7XG5cbkVBTjhSZWFkZXIucHJvdG90eXBlLl9kZWNvZGVQYXlsb2FkID0gZnVuY3Rpb24oY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICBjb2RlID0gc2VsZi5fZGVjb2RlQ29kZShjb2RlLmVuZCwgc2VsZi5DT0RFX0dfU1RBUlQpO1xuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgIH1cblxuICAgIGNvZGUgPSBzZWxmLl9maW5kUGF0dGVybihzZWxmLk1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgdHJ1ZSwgZmFsc2UpO1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBzZWxmLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCBzZWxmLkNPREVfR19TVEFSVCk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU44UmVhZGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWRlci9lYW5fOF9yZWFkZXIuanMiLCJpbXBvcnQgQmFyY29kZVJlYWRlciBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ2xvZGFzaCc7XG5cbmZ1bmN0aW9uIEkyb2Y1UmVhZGVyKG9wdHMpIHtcbiAgICBvcHRzID0gbWVyZ2UoZ2V0RGVmYXVsQ29uZmlnKCksIG9wdHMpO1xuICAgIEJhcmNvZGVSZWFkZXIuY2FsbCh0aGlzLCBvcHRzKTtcbiAgICB0aGlzLmJhclNwYWNlUmF0aW8gPSBbMSwgMV07XG4gICAgaWYgKG9wdHMubm9ybWFsaXplQmFyU3BhY2VXaWR0aCkge1xuICAgICAgICB0aGlzLlNJTkdMRV9DT0RFX0VSUk9SID0gMC4zODtcbiAgICAgICAgdGhpcy5BVkdfQ09ERV9FUlJPUiA9IDAuMDk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWxDb25maWcoKSB7XG4gICAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMoSTJvZjVSZWFkZXIuQ09ORklHX0tFWVMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGNvbmZpZ1trZXldID0gSTJvZjVSZWFkZXIuQ09ORklHX0tFWVNba2V5XS5kZWZhdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbnZhciBOID0gMSxcbiAgICBXID0gMyxcbiAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBTVEFSVF9QQVRURVJOOiB7dmFsdWU6IFtOLCBOLCBOLCBOXX0sXG4gICAgICAgIFNUT1BfUEFUVEVSTjoge3ZhbHVlOiBbTiwgTiwgV119LFxuICAgICAgICBDT0RFX1BBVFRFUk46IHt2YWx1ZTogW1xuICAgICAgICAgICAgW04sIE4sIFcsIFcsIE5dLFxuICAgICAgICAgICAgW1csIE4sIE4sIE4sIFddLFxuICAgICAgICAgICAgW04sIFcsIE4sIE4sIFddLFxuICAgICAgICAgICAgW1csIFcsIE4sIE4sIE5dLFxuICAgICAgICAgICAgW04sIE4sIFcsIE4sIFddLFxuICAgICAgICAgICAgW1csIE4sIFcsIE4sIE5dLFxuICAgICAgICAgICAgW04sIFcsIFcsIE4sIE5dLFxuICAgICAgICAgICAgW04sIE4sIE4sIFcsIFddLFxuICAgICAgICAgICAgW1csIE4sIE4sIFcsIE5dLFxuICAgICAgICAgICAgW04sIFcsIE4sIFcsIE5dXG4gICAgICAgIF19LFxuICAgICAgICBTSU5HTEVfQ09ERV9FUlJPUjoge3ZhbHVlOiAwLjc4LCB3cml0YWJsZTogdHJ1ZX0sXG4gICAgICAgIEFWR19DT0RFX0VSUk9SOiB7dmFsdWU6IDAuMzgsIHdyaXRhYmxlOiB0cnVlfSxcbiAgICAgICAgTUFYX0NPUlJFQ1RJT05fRkFDVE9SOiB7dmFsdWU6IDV9LFxuICAgICAgICBGT1JNQVQ6IHt2YWx1ZTogXCJpMm9mNVwifVxuICAgIH07XG5cbkkyb2Y1UmVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFyY29kZVJlYWRlci5wcm90b3R5cGUsIHByb3BlcnRpZXMpO1xuSTJvZjVSZWFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSTJvZjVSZWFkZXI7XG5cbkkyb2Y1UmVhZGVyLnByb3RvdHlwZS5fbWF0Y2hQYXR0ZXJuID0gZnVuY3Rpb24oY291bnRlciwgY29kZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgY291bnRlclN1bSA9IFswLCAwXSxcbiAgICAgICAgICAgIGNvZGVTdW0gPSBbMCwgMF0sXG4gICAgICAgICAgICBjb3JyZWN0aW9uID0gWzAsIDBdLFxuICAgICAgICAgICAgY29ycmVjdGlvblJhdGlvID0gdGhpcy5NQVhfQ09SUkVDVElPTl9GQUNUT1IsXG4gICAgICAgICAgICBjb3JyZWN0aW9uUmF0aW9JbnZlcnNlID0gMSAvIGNvcnJlY3Rpb25SYXRpbztcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY291bnRlclN1bVtpICUgMl0gKz0gY291bnRlcltpXTtcbiAgICAgICAgICAgIGNvZGVTdW1baSAlIDJdICs9IGNvZGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29ycmVjdGlvblswXSA9IGNvZGVTdW1bMF0gLyBjb3VudGVyU3VtWzBdO1xuICAgICAgICBjb3JyZWN0aW9uWzFdID0gY29kZVN1bVsxXSAvIGNvdW50ZXJTdW1bMV07XG5cbiAgICAgICAgY29ycmVjdGlvblswXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMF0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICBjb3JyZWN0aW9uWzFdID0gTWF0aC5tYXgoTWF0aC5taW4oY29ycmVjdGlvblsxXSwgY29ycmVjdGlvblJhdGlvKSwgY29ycmVjdGlvblJhdGlvSW52ZXJzZSk7XG4gICAgICAgIHRoaXMuYmFyU3BhY2VSYXRpbyA9IGNvcnJlY3Rpb247XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb3VudGVyW2ldICo9IHRoaXMuYmFyU3BhY2VSYXRpb1tpICUgMl07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEJhcmNvZGVSZWFkZXIucHJvdG90eXBlLl9tYXRjaFBhdHRlcm4uY2FsbCh0aGlzLCBjb3VudGVyLCBjb2RlKTtcbn07XG5cbkkyb2Y1UmVhZGVyLnByb3RvdHlwZS5fZmluZFBhdHRlcm4gPSBmdW5jdGlvbihwYXR0ZXJuLCBvZmZzZXQsIGlzV2hpdGUsIHRyeUhhcmRlcikge1xuICAgIHZhciBjb3VudGVyID0gW10sXG4gICAgICAgIHNlbGYgPSB0aGlzLFxuICAgICAgICBpLFxuICAgICAgICBjb3VudGVyUG9zID0gMCxcbiAgICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBqLFxuICAgICAgICBzdW0sXG4gICAgICAgIG5vcm1hbGl6ZWQsXG4gICAgICAgIGVwc2lsb24gPSBzZWxmLkFWR19DT0RFX0VSUk9SO1xuXG4gICAgaXNXaGl0ZSA9IGlzV2hpdGUgfHwgZmFsc2U7XG4gICAgdHJ5SGFyZGVyID0gdHJ5SGFyZGVyIHx8IGZhbHNlO1xuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fbmV4dFNldChzZWxmLl9yb3cpO1xuICAgIH1cblxuICAgIGZvciAoIGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb3VudGVyW2ldID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKCBpID0gb2Zmc2V0OyBpIDwgc2VsZi5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNvdW50ZXJbal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHJ5SGFyZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aCAtIDI7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAyXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAxXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuSTJvZjVSZWFkZXIucHJvdG90eXBlLl9maW5kU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX25leHRTZXQoc2VsZi5fcm93KSxcbiAgICAgICAgc3RhcnRJbmZvLFxuICAgICAgICBuYXJyb3dCYXJXaWR0aCA9IDE7XG5cbiAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICBzdGFydEluZm8gPSBzZWxmLl9maW5kUGF0dGVybihzZWxmLlNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbmFycm93QmFyV2lkdGggPSBNYXRoLmZsb29yKChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KSAvIDQpO1xuICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gc3RhcnRJbmZvLnN0YXJ0IC0gbmFycm93QmFyV2lkdGggKiAxMDtcbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX21hdGNoUmFuZ2UobGVhZGluZ1doaXRlc3BhY2VTdGFydCwgc3RhcnRJbmZvLnN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ID0gc3RhcnRJbmZvLmVuZDtcbiAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICB9XG59O1xuXG5JMm9mNVJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSA9IGZ1bmN0aW9uKGVuZEluZm8pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZDtcblxuICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHNlbGYuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHNlbGYuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuSTJvZjVSZWFkZXIucHJvdG90eXBlLl9maW5kRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBlbmRJbmZvLFxuICAgICAgICB0bXA7XG5cbiAgICBzZWxmLl9yb3cucmV2ZXJzZSgpO1xuICAgIGVuZEluZm8gPSBzZWxmLl9maW5kUGF0dGVybihzZWxmLlNUT1BfUEFUVEVSTik7XG4gICAgc2VsZi5fcm93LnJldmVyc2UoKTtcblxuICAgIGlmIChlbmRJbmZvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJldmVyc2UgbnVtYmVyc1xuICAgIHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgZW5kSW5mby5zdGFydCA9IHNlbGYuX3Jvdy5sZW5ndGggLSBlbmRJbmZvLmVuZDtcbiAgICBlbmRJbmZvLmVuZCA9IHNlbGYuX3Jvdy5sZW5ndGggLSB0bXA7XG5cbiAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHNlbGYuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG59O1xuXG5JMm9mNVJlYWRlci5wcm90b3R5cGUuX2RlY29kZVBhaXIgPSBmdW5jdGlvbihjb3VudGVyUGFpcikge1xuICAgIHZhciBpLFxuICAgICAgICBjb2RlLFxuICAgICAgICBjb2RlcyA9IFtdLFxuICAgICAgICBzZWxmID0gdGhpcztcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudGVyUGFpci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc2VsZi5fZGVjb2RlQ29kZShjb3VudGVyUGFpcltpXSk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvZGVzO1xufTtcblxuSTJvZjVSZWFkZXIucHJvdG90eXBlLl9kZWNvZGVDb2RlID0gZnVuY3Rpb24oY291bnRlcikge1xuICAgIHZhciBqLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgc3VtID0gMCxcbiAgICAgICAgbm9ybWFsaXplZCxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGVwc2lsb24gPSBzZWxmLkFWR19DT0RFX0VSUk9SLFxuICAgICAgICBjb2RlLFxuICAgICAgICBiZXN0TWF0Y2ggPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcblxuICAgIGZvciAoIGogPSAwOyBqIDwgY291bnRlci5sZW5ndGg7IGorKykge1xuICAgICAgICBzdW0gKz0gY291bnRlcltqXTtcbiAgICB9XG4gICAgZm9yIChjb2RlID0gMDsgY29kZSA8IHNlbGYuQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgIGVycm9yID0gc2VsZi5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHNlbGYuQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmVzdE1hdGNoLmVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgIH1cbn07XG5cbkkyb2Y1UmVhZGVyLnByb3RvdHlwZS5fZGVjb2RlUGF5bG9hZCA9IGZ1bmN0aW9uKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcykge1xuICAgIHZhciBpLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgcG9zID0gMCxcbiAgICAgICAgY291bnRlckxlbmd0aCA9IGNvdW50ZXJzLmxlbmd0aCxcbiAgICAgICAgY291bnRlclBhaXIgPSBbWzAsIDAsIDAsIDAsIDBdLCBbMCwgMCwgMCwgMCwgMF1dLFxuICAgICAgICBjb2RlcztcblxuICAgIHdoaWxlIChwb3MgPCBjb3VudGVyTGVuZ3RoKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgIGNvdW50ZXJQYWlyWzBdW2ldID0gY291bnRlcnNbcG9zXSAqIHRoaXMuYmFyU3BhY2VSYXRpb1swXTtcbiAgICAgICAgICAgIGNvdW50ZXJQYWlyWzFdW2ldID0gY291bnRlcnNbcG9zICsgMV0gKiB0aGlzLmJhclNwYWNlUmF0aW9bMV07XG4gICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcyA9IHNlbGYuX2RlY29kZVBhaXIoY291bnRlclBhaXIpO1xuICAgICAgICBpZiAoIWNvZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGVzW2ldLmNvZGUgKyBcIlwiKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29kZXM7XG59O1xuXG5JMm9mNVJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeUNvdW50ZXJMZW5ndGggPSBmdW5jdGlvbihjb3VudGVycykge1xuICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xufTtcblxuSTJvZjVSZWFkZXIucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhcnRJbmZvLFxuICAgICAgICBlbmRJbmZvLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgY29kZSxcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGRlY29kZWRDb2RlcyA9IFtdLFxuICAgICAgICBjb3VudGVycztcblxuICAgIHN0YXJ0SW5mbyA9IHNlbGYuX2ZpbmRTdGFydCgpO1xuICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgZW5kSW5mbyA9IHNlbGYuX2ZpbmRFbmQoKTtcbiAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY291bnRlcnMgPSBzZWxmLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgZmFsc2UpO1xuICAgIGlmICghc2VsZi5fdmVyaWZ5Q291bnRlckxlbmd0aChjb3VudGVycykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvZGUgPSBzZWxmLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCAlIDIgIT09IDAgfHxcbiAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggPCA2KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKFwiXCIpLFxuICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICBlbmQ6IGVuZEluZm8uZW5kLFxuICAgICAgICBzdGFydEluZm86IHN0YXJ0SW5mbyxcbiAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXNcbiAgICB9O1xufTtcblxuSTJvZjVSZWFkZXIuQ09ORklHX0tFWVMgPSB7XG4gICAgbm9ybWFsaXplQmFyU3BhY2VXaWR0aDoge1xuICAgICAgICAndHlwZSc6ICdib29sZWFuJyxcbiAgICAgICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0lmIHRydWUsIHRoZSByZWFkZXIgdHJpZXMgdG8gbm9ybWFsaXplIHRoZScgK1xuICAgICAgICAnd2lkdGgtZGlmZmVyZW5jZSBiZXR3ZWVuIGJhcnMgYW5kIHNwYWNlcydcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJMm9mNVJlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvaTJvZjVfcmVhZGVyLmpzIiwiaW1wb3J0IEVBTlJlYWRlciBmcm9tICcuL2Vhbl9yZWFkZXInO1xuXG5mdW5jdGlvbiBVUENFUmVhZGVyKG9wdHMsIHN1cHBsZW1lbnRzKSB7XG4gICAgRUFOUmVhZGVyLmNhbGwodGhpcywgb3B0cywgc3VwcGxlbWVudHMpO1xufVxuXG52YXIgcHJvcGVydGllcyA9IHtcbiAgICBDT0RFX0ZSRVFVRU5DWToge3ZhbHVlOiBbXG4gICAgICAgIFsgNTYsIDUyLCA1MCwgNDksIDQ0LCAzOCwgMzUsIDQyLCA0MSwgMzcgXSxcbiAgICAgICAgWzcsIDExLCAxMywgMTQsIDE5LCAyNSwgMjgsIDIxLCAyMiwgMjZdXX0sXG4gICAgU1RPUF9QQVRURVJOOiB7IHZhbHVlOiBbMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogN119LFxuICAgIEZPUk1BVDoge3ZhbHVlOiBcInVwY19lXCIsIHdyaXRlYWJsZTogZmFsc2V9XG59O1xuXG5VUENFUmVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRUFOUmVhZGVyLnByb3RvdHlwZSwgcHJvcGVydGllcyk7XG5VUENFUmVhZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVQQ0VSZWFkZXI7XG5cblVQQ0VSZWFkZXIucHJvdG90eXBlLl9kZWNvZGVQYXlsb2FkID0gZnVuY3Rpb24oY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICBmb3IgKCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBjb2RlID0gc2VsZi5fZGVjb2RlQ29kZShjb2RlLmVuZCk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUuY29kZSA+PSBzZWxmLkNPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgY29kZS5jb2RlID0gY29kZS5jb2RlIC0gc2VsZi5DT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDEgPDwgKDUgLSBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLl9kZXRlcm1pbmVQYXJpdHkoY29kZUZyZXF1ZW5jeSwgcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29kZTtcbn07XG5cblVQQ0VSZWFkZXIucHJvdG90eXBlLl9kZXRlcm1pbmVQYXJpdHkgPSBmdW5jdGlvbihjb2RlRnJlcXVlbmN5LCByZXN1bHQpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbnJTeXN0ZW07XG5cbiAgICBmb3IgKG5yU3lzdGVtID0gMDsgbnJTeXN0ZW0gPCB0aGlzLkNPREVfRlJFUVVFTkNZLmxlbmd0aDsgbnJTeXN0ZW0rKyl7XG4gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdGhpcy5DT0RFX0ZSRVFVRU5DWVtuclN5c3RlbV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSB0aGlzLkNPREVfRlJFUVVFTkNZW25yU3lzdGVtXVtpXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG5yU3lzdGVtKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5VUENFUmVhZGVyLnByb3RvdHlwZS5fY29udmVydFRvVVBDQSA9IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHZhciB1cGNhID0gW3Jlc3VsdFswXV0sXG4gICAgICAgIGxhc3REaWdpdCA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMl07XG5cbiAgICBpZiAobGFzdERpZ2l0IDw9IDIpIHtcbiAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCAzKSlcbiAgICAgICAgICAgIC5jb25jYXQoW2xhc3REaWdpdCwgMCwgMCwgMCwgMF0pXG4gICAgICAgICAgICAuY29uY2F0KHJlc3VsdC5zbGljZSgzLCA2KSk7XG4gICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDMpIHtcbiAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA0KSlcbiAgICAgICAgICAgIC5jb25jYXQoWzAsIDAsIDAsIDAsIDBdKVxuICAgICAgICAgICAgLmNvbmNhdChyZXN1bHQuc2xpY2UoNCwgNikpO1xuICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA0KSB7XG4gICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNSkpXG4gICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCAwLCByZXN1bHRbNV1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB1cGNhID0gdXBjYS5jb25jYXQocmVzdWx0LnNsaWNlKDEsIDYpKVxuICAgICAgICAgICAgLmNvbmNhdChbMCwgMCwgMCwgMCwgbGFzdERpZ2l0XSk7XG4gICAgfVxuXG4gICAgdXBjYS5wdXNoKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0pO1xuICAgIHJldHVybiB1cGNhO1xufTtcblxuVVBDRVJlYWRlci5wcm90b3R5cGUuX2NoZWNrc3VtID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgcmV0dXJuIEVBTlJlYWRlci5wcm90b3R5cGUuX2NoZWNrc3VtLmNhbGwodGhpcywgdGhpcy5fY29udmVydFRvVVBDQShyZXN1bHQpKTtcbn07XG5cblVQQ0VSZWFkZXIucHJvdG90eXBlLl9maW5kRW5kID0gZnVuY3Rpb24ob2Zmc2V0LCBpc1doaXRlKSB7XG4gICAgaXNXaGl0ZSA9IHRydWU7XG4gICAgcmV0dXJuIEVBTlJlYWRlci5wcm90b3R5cGUuX2ZpbmRFbmQuY2FsbCh0aGlzLCBvZmZzZXQsIGlzV2hpdGUpO1xufTtcblxuVVBDRVJlYWRlci5wcm90b3R5cGUuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSA9IGZ1bmN0aW9uKGVuZEluZm8pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZDtcblxuICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHNlbGYuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHNlbGYuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVVBDRVJlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvdXBjX2VfcmVhZGVyLmpzIiwiaW1wb3J0IEVBTlJlYWRlciBmcm9tICcuL2Vhbl9yZWFkZXInO1xuXG5mdW5jdGlvbiBVUENSZWFkZXIob3B0cywgc3VwcGxlbWVudHMpIHtcbiAgICBFQU5SZWFkZXIuY2FsbCh0aGlzLCBvcHRzLCBzdXBwbGVtZW50cyk7XG59XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICAgIEZPUk1BVDoge3ZhbHVlOiBcInVwY19hXCIsIHdyaXRlYWJsZTogZmFsc2V9XG59O1xuXG5VUENSZWFkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFQU5SZWFkZXIucHJvdG90eXBlLCBwcm9wZXJ0aWVzKTtcblVQQ1JlYWRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVUENSZWFkZXI7XG5cblVQQ1JlYWRlci5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSBFQU5SZWFkZXIucHJvdG90eXBlLl9kZWNvZGUuY2FsbCh0aGlzKTtcblxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNvZGUgJiYgcmVzdWx0LmNvZGUubGVuZ3RoID09PSAxMyAmJiByZXN1bHQuY29kZS5jaGFyQXQoMCkgPT09IFwiMFwiKSB7XG4gICAgICAgIHJlc3VsdC5jb2RlID0gcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFVQQ1JlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkZXIvdXBjX3JlYWRlci5qcyIsIm1vZHVsZS5leHBvcnRzID0gY29weVxuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyIHRvIGFub3RoZXJcbiAqXG4gKiBAYWxpYXMgbWF0Mi5jb3B5XG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF1cbiAgb3V0WzFdID0gYVsxXVxuICBvdXRbMl0gPSBhWzJdXG4gIG91dFszXSA9IGFbM11cbiAgcmV0dXJuIG91dFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2dsLW1hdDIvY29weS5qc1xuLy8gbW9kdWxlIGlkID0gNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAYWxpYXMgbWF0Mi5jcmVhdGVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoNClcbiAgb3V0WzBdID0gMVxuICBvdXRbMV0gPSAwXG4gIG91dFsyXSA9IDBcbiAgb3V0WzNdID0gMVxuICByZXR1cm4gb3V0XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2wtbWF0Mi9jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gaW52ZXJ0XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJcbiAqXG4gKiBAYWxpYXMgbWF0Mi5pbnZlcnRcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdXG4gIHZhciBhMSA9IGFbMV1cbiAgdmFyIGEyID0gYVsyXVxuICB2YXIgYTMgPSBhWzNdXG4gIHZhciBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMVxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAgYTMgKiBkZXRcbiAgb3V0WzFdID0gLWExICogZGV0XG4gIG91dFsyXSA9IC1hMiAqIGRldFxuICBvdXRbM10gPSAgYTAgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2wtbWF0Mi9pbnZlcnQuanNcbi8vIG1vZHVsZSBpZCA9IDgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gc2NhbGVcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJcbiAgICBvdXRbMV0gPSBhWzFdICogYlxuICAgIHJldHVybiBvdXRcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2wtdmVjMi9zY2FsZS5qc1xuLy8gbW9kdWxlIGlkID0gODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm1NYXQyXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdXG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeVxuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHlcbiAgICByZXR1cm4gb3V0XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2dsLXZlYzIvdHJhbnNmb3JtTWF0Mi5qc1xuLy8gbW9kdWxlIGlkID0gODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBjbG9uZTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cbmZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSgzKVxuICAgIG91dFswXSA9IGFbMF1cbiAgICBvdXRbMV0gPSBhWzFdXG4gICAgb3V0WzJdID0gYVsyXVxuICAgIHJldHVybiBvdXRcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2wtdmVjMy9jbG9uZS5qc1xuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19IYXNoLmpzXG4vLyBtb2R1bGUgaWQgPSA4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgc3RhY2tDbGVhciA9IHJlcXVpcmUoJy4vX3N0YWNrQ2xlYXInKSxcbiAgICBzdGFja0RlbGV0ZSA9IHJlcXVpcmUoJy4vX3N0YWNrRGVsZXRlJyksXG4gICAgc3RhY2tHZXQgPSByZXF1aXJlKCcuL19zdGFja0dldCcpLFxuICAgIHN0YWNrSGFzID0gcmVxdWlyZSgnLi9fc3RhY2tIYXMnKSxcbiAgICBzdGFja1NldCA9IHJlcXVpcmUoJy4vX3N0YWNrU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGFjaztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX1N0YWNrLmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fVWludDhBcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXBwbHkuanNcbi8vIG1vZHVsZSBpZCA9IDg3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hcnJheU1hcC5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2FycmF5UHVzaC5qc1xuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlQ3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNGbGF0dGVuYWJsZSA9IHJlcXVpcmUoJy4vX2lzRmxhdHRlbmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZsYXR0ZW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlRmxhdHRlbi5qc1xuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUZvci5qc1xuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VHZXQuanNcbi8vIG1vZHVsZSBpZCA9IDk0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VIYXNJbi5qc1xuLy8gbW9kdWxlIGlkID0gOTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanNcbi8vIG1vZHVsZSBpZCA9IDk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlSXNOYXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUtleXNJbi5qc1xuLy8gbW9kdWxlIGlkID0gOTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlTWVyZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDEwMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICB0b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi90b1BsYWluT2JqZWN0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICogIGNvdW50ZXJwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgIHNyY1ZhbHVlID0gc291cmNlW2tleV0sXG4gICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICBpZiAoc3RhY2tlZCkge1xuICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgKHNyY0luZGV4ICYmIGlzRnVuY3Rpb24ob2JqVmFsdWUpKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qc1xuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlUGlja0J5ID0gcmVxdWlyZSgnLi9fYmFzZVBpY2tCeScpLFxuICAgIGhhc0luID0gcmVxdWlyZSgnLi9oYXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2s7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlUGljay5qc1xuLy8gbW9kdWxlIGlkID0gMTAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVBpY2tCeS5qc1xuLy8gbW9kdWxlIGlkID0gMTAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VSZXN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlVGltZXMuanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlVG9TdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDEwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVVuYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qc1xuLy8gbW9kdWxlIGlkID0gMTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICBidWZmZXIuY29weShyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQnVmZmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2xvbmVCdWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDExMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDExMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jb3B5QXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpO1xuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMgdG8gY29weS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICB2YXIgaXNOZXcgPSAhb2JqZWN0O1xuICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5T2JqZWN0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY29weU9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmVKc0RhdGE7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jb3JlSnNEYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qc1xuLy8gbW9kdWxlIGlkID0gMTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJhc2VGb3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19mbGF0UmVzdC5qc1xuLy8gbW9kdWxlIGlkID0gMTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2dldFJhd1RhZy5qc1xuLy8gbW9kdWxlIGlkID0gMTE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0VmFsdWUuanNcbi8vIG1vZHVsZSBpZCA9IDEyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUGF0aDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2hhc1BhdGguanNcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2hhc2hDbGVhci5qc1xuLy8gbW9kdWxlIGlkID0gMTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2hhc2hEZWxldGUuanNcbi8vIG1vZHVsZSBpZCA9IDEyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faGFzaEdldC5qc1xuLy8gbW9kdWxlIGlkID0gMTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19oYXNoSGFzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faGFzaFNldC5qc1xuLy8gbW9kdWxlIGlkID0gMTI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9fYmFzZUNyZWF0ZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZU9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2luaXRDbG9uZU9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faXNLZXkuanNcbi8vIG1vZHVsZSBpZCA9IDEzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faXNLZXlhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc01hc2tlZC5qc1xuLy8gbW9kdWxlIGlkID0gMTMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUdldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qc1xuLy8gbW9kdWxlIGlkID0gMTM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qc1xuLy8gbW9kdWxlIGlkID0gMTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX21hcENhY2hlR2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tYXBDYWNoZUhhcy5qc1xuLy8gbW9kdWxlIGlkID0gMTQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tYXBDYWNoZVNldC5qc1xuLy8gbW9kdWxlIGlkID0gMTQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZW1vaXplID0gcmVxdWlyZSgnLi9tZW1vaXplJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbnZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplQ2FwcGVkO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qc1xuLy8gbW9kdWxlIGlkID0gMTQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX25hdGl2ZUtleXNJbi5qc1xuLy8gbW9kdWxlIGlkID0gMTQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19ub2RlVXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gMTQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fb3ZlckFyZy5qc1xuLy8gbW9kdWxlIGlkID0gMTQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3Nob3J0T3V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrQ2xlYXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zdGFja0NsZWFyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc3RhY2tEZWxldGUuanNcbi8vIG1vZHVsZSBpZCA9IDE1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zdGFja0dldC5qc1xuLy8gbW9kdWxlIGlkID0gMTUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zdGFja0hhcy5qc1xuLy8gbW9kdWxlIGlkID0gMTUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc3RhY2tTZXQuanNcbi8vIG1vZHVsZSBpZCA9IDE1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlTGVhZGluZ0RvdCA9IC9eXFwuLyxcbiAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAocmVMZWFkaW5nRG90LnRlc3Qoc3RyaW5nKSkge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qc1xuLy8gbW9kdWxlIGlkID0gMTU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1NvdXJjZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3RvU291cmNlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2NvbnN0YW50LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvZmxhdHRlbi5qc1xuLy8gbW9kdWxlIGlkID0gMTU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBiYXNlSGFzSW4gPSByZXF1aXJlKCcuL19iYXNlSGFzSW4nKSxcbiAgICBoYXNQYXRoID0gcmVxdWlyZSgnLi9faGFzUGF0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzSW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2hhc0luLmpzXG4vLyBtb2R1bGUgaWQgPSAxNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDE1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9tZW1vaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2VQaWNrID0gcmVxdWlyZSgnLi9fYmFzZVBpY2snKSxcbiAgICBmbGF0UmVzdCA9IHJlcXVpcmUoJy4vX2ZsYXRSZXN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAqL1xudmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwaWNrO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9waWNrLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvc3R1YkZhbHNlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gKi9cbmZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvUGxhaW5PYmplY3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL3RvUGxhaW5PYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDE2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvdG9TdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9RdWFnZ2Evd2VicGFjay9teU1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vUXVhZ2dhL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc3VwZXJQcm9wQmFzZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovL1F1YWdnYS8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2FuYWx5dGljcy9yZXN1bHQtY29sbGVjdG9yLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vY2x1c3Rlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2V2ZW50cy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2hzdjJyZ2IudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9pbWFnZS1kZWJ1Zy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2ltYWdlLXdyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9tZWRpYS1kZXZpY2VzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vbWVyZ2UudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcuZGV2LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9kZWNvZGVyL2JhcmNvZGUtZGVjb2Rlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvZGVjb2Rlci9icmVzZW5oYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2NhbWVyYS1hY2Nlc3MudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2V4aWYtaGVscGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9mcmFtZS1ncmFiYmVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9pbWFnZS1sb2FkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2ltYWdlLXN0cmVhbS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW5wdXQtc3RyZWFtLXV0aWxzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9pbnB1dC1zdHJlYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2xpdmUtc3RyZWFtLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC92aWRlby1zdHJlYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvYmFyY29kZS1sb2NhdG9yLXV0aWxzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL2JhcmNvZGUtbG9jYXRvci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvbG9jYXRvci9yYXN0ZXJpemVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL3NrZWxldG9uaXplci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvbG9jYXRvci90cmFjZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyLzJvZjUtcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvYmFyY29kZS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RhYmFyLXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGUtMTI4LXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGUtMzktcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZS0zOS12aW4tcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZS05My1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tMi1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tNS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tOC1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaTJvZjUtcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGMtZS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGMtcmVhZGVyLnRzIl0sIm5hbWVzIjpbIlJlc3VsdENvbGxlY3RvciIsImNvbmZpZyIsIl9yZXN1bHRzIiwiQXJyYXkiLCJfY29uZmlnIiwiX2NhcGFjaXR5IiwiY2FwYWNpdHkiLCJfY2FwdHVyZSIsImNhcHR1cmUiLCJfY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiX2NvbnRleHQiLCJnZXRDb250ZXh0IiwiZGF0YSIsImltYWdlV2lkdGgiLCJpbWFnZUhlaWdodCIsImNvZGVSZXN1bHQiLCJfY29udGFpbnMiLCJfcGFzc2VzRmlsdGVyIiwicmVzdWx0Iiwid2lkdGgiLCJoZWlnaHQiLCJJbWFnZURlYnVnIiwiZHJhd0ltYWdlIiwiZnJhbWUiLCJ0b0RhdGFVUkwiLCJwdXNoIiwiYmxhY2tsaXN0Iiwic29tZSIsIml0ZW0iLCJPYmplY3QiLCJrZXlzIiwiZXZlcnkiLCJrZXkiLCJmaWx0ZXIiLCJDbHVzdGVyIiwibW9tZW50cyIsInRocmVzaG9sZCIsImNsdXN0ZXJzIiwiZm9yRWFjaCIsIm1vbWVudCIsIm1hdGNoaW5nQ2x1c3RlciIsImZpbmQiLCJjbHVzdGVyIiwiZml0cyIsImFkZCIsIl90aHJlc2hvbGQiLCJfbW9tZW50cyIsIl9jZW50ZXIiLCJyYWQiLCJ4IiwieSIsInBvaW50IiwicmVkdWNlIiwic3VtIiwicCIsImxlbmd0aCIsIk1hdGgiLCJjb3MiLCJzaW4iLCJzaW1pbGFyaXR5IiwiYWJzIiwiZXZlbnRzIiwiRXZlbnRzIiwiZXZlbnQiLCJjYWxsYmFjayIsImFzeW5jIiwic3Vic2NyaXB0aW9uIiwiZ2V0RXZlbnQiLCJzdWJzY3JpcHRpb25zIiwidHlwZSIsImV2ZW50SXRlbSIsIm9uY2UiLCJwdWJsaXNoU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlIiwiZXZlbnROYW1lIiwic2V0VGltZW91dCIsImhzdjJyZ2IiLCJoc3YiLCJyZ2IiLCJoIiwicyIsInYiLCJjIiwibSIsInIiLCJnIiwiYiIsImRyYXdQYXRoIiwicGF0aCIsImNvbnRleHQiLCJjb2xvciIsImxpbmVXaWR0aCIsInN0cm9rZVN0eWxlIiwiZmlsbFN0eWxlIiwiYmVnaW5QYXRoIiwibW92ZVRvIiwic2xpY2UiLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJpbWFnZURhdGEiLCJjYW52YXNEYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiaW1hZ2VJbmRleCIsImNhbnZhc0luZGV4IiwidmFsdWUiLCJwdXRJbWFnZURhdGEiLCJJbWFnZVdyYXBwZXIiLCJzaXplIiwiYXJyYXlUeXBlIiwiaW5pdGlhbGl6ZSIsIlVpbnQ4QXJyYXkiLCJmaWxsIiwiYm9yZGVyIiwiaW1hZ2VXcmFwcGVyIiwiZnJvbVgiLCJmcm9tWSIsInNpemVZIiwic2l6ZVgiLCJpIiwibGFiZWxDb3VudCIsImxhYmVsU3VtIiwibTAwIiwibTAxIiwibTEwIiwibTExIiwibTAyIiwibTIwIiwidGhldGEiLCJ5c3EiLCJ2YWwiLCJsYWJlbCIsIlBJIiwiUElfNCIsImlzTmFOIiwieF8iLCJ5XyIsIm11MTEiLCJtdTAyIiwibXUyMCIsInRtcCIsImF0YW4iLCJzY2FsZSIsImN1cnJlbnQiLCJwaXhlbCIsImdldCIsIndoaXRlUmdiIiwiYmxhY2tSZ2IiLCJlbnVtZXJhdGVEZXZpY2VzIiwibmF2aWdhdG9yIiwibWVkaWFEZXZpY2VzIiwiUHJvbWlzZSIsInJlamVjdCIsIkVycm9yIiwiZ2V0VXNlck1lZGlhIiwiY29uc3RyYWludHMiLCJtZXJnZSIsImlzT2JqZWN0Iiwib2JqIiwib2JqZWN0cyIsInByZXYiLCJwVmFsIiwib1ZhbCIsImlzQXJyYXkiLCJpbnB1dFN0cmVhbSIsIm5hbWUiLCJmYWNpbmdNb2RlIiwiYXJlYSIsInRvcCIsInJpZ2h0IiwibGVmdCIsImJvdHRvbSIsInNpbmdsZUNoYW5uZWwiLCJsb2NhdGUiLCJudW1PZldvcmtlcnMiLCJkZWNvZGVyIiwicmVhZGVycyIsImRlYnVnIiwiZHJhd0JvdW5kaW5nQm94Iiwic2hvd0ZyZXF1ZW5jeSIsImRyYXdTY2FubGluZSIsInNob3dQYXR0ZXJuIiwibG9jYXRvciIsImhhbGZTYW1wbGUiLCJwYXRjaFNpemUiLCJzaG93Q2FudmFzIiwic2hvd1BhdGNoZXMiLCJzaG93Rm91bmRQYXRjaGVzIiwic2hvd1NrZWxldG9uIiwic2hvd0xhYmVscyIsInNob3dQYXRjaExhYmVscyIsInNob3dSZW1haW5pbmdQYXRjaExhYmVscyIsImJveEZyb21QYXRjaGVzIiwic2hvd1RyYW5zZm9ybWVkIiwic2hvd1RyYW5zZm9ybWVkQm94Iiwic2hvd0JCIiwiQmFyY29kZURlY29kZXIiLCJpbnB1dEltYWdlV3JhcHBlciIsIl9pbnB1dEltYWdlV3JhcHBlciIsIl9iYXJjb2RlUmVhZGVycyIsInByb2Nlc3MiLCJkZWJ1Z0RpdiIsInF1ZXJ5U2VsZWN0b3IiLCJfZnJlcXVlbmN5Q2FudmFzIiwiY2xhc3NOYW1lIiwiYXBwZW5kQ2hpbGQiLCJzdHlsZSIsImRpc3BsYXkiLCJfcGF0dGVybkNhbnZhcyIsIm92ZXJsYXlDYW52YXMiLCJfb3ZlcmxheUNvbnRleHQiLCJfaW5pdFJlYWRlcnMiLCJib3hlcyIsImJhcmNvZGUiLCJtdWx0aXBsZSIsImJhcmNvZGVzIiwibWFwIiwiYm94IiwiZGVjb2RlRnJvbUJvdW5kaW5nQm94IiwiX2RyYXdQYXRoIiwibGluZSIsIl9nZXRMaW5lIiwiYW5nbGUiLCJhdGFuMiIsIl9nZXRFeHRlbmRlZExpbmUiLCJfdHJ5RGVjb2RlIiwiX3RyeURlY29kZUJydXRlRm9yY2UiLCJwYXR0ZXJuIiwiYmFyY29kZUxpbmUiLCJyZWFkZXJDb25maWciLCJyZWFkZXIiLCJjb25maWd1cmF0aW9uIiwic3VwcGxlbWVudHMiLCJmb3JtYXQiLCJjb25zb2xlIiwibG9nIiwic3VwcGxlbWVudCIsIlJlYWRlcnMiLCJGT1JNQVQiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0ZW5kTGluZSIsImFtb3VudCIsImV4dGVuc2lvbiIsImxpbmVMZW5ndGgiLCJzcXJ0IiwiZXh0ZW5zaW9uTGVuZ3RoIiwiaW5JbWFnZVdpdGhCb3JkZXIiLCJCcmVzZW5oYW0iLCJnZXRCYXJjb2RlTGluZSIsIl9wcmludEZyZXF1ZW5jeSIsInRvQmluYXJ5TGluZSIsIl9wcmludFBhdHRlcm4iLCJkZWNvZGVQYXR0ZXJuIiwibGluZUFuZ2xlIiwic2lkZUxlbmd0aCIsInNsaWNlcyIsInhkaXIiLCJ5ZGlyIiwiZGlyIiwiZmlsbFJlY3QiLCJTbG9wZSIsInAxIiwicDIiLCJ4MCIsInkwIiwieDEiLCJ5MSIsInN0ZWVwIiwibWluIiwibWF4IiwicmVhZCIsImEiLCJkZWx0YXgiLCJkZWx0YXkiLCJlcnJvciIsInlzdGVwIiwiY2VudGVyIiwiZXh0cmVtYSIsInJUaHJlc2hvbGQiLCJjdXJyZW50RGlyIiwiVXAiLCJEb3duIiwicG9zIiwic2xvcGUiLCJzbG9wZTIiLCJqIiwiX3N0cmVhbSIsIkNhbWVyYUFjY2VzcyIsInJlcXVlc3QiLCJ2aWRlbyIsInZpZGVvQ29uc3RyYWludHMiLCJub3JtYWxpemVkQ29uc3RyYWludHMiLCJwaWNrQ29uc3RyYWludHMiLCJzcmNPYmplY3QiLCJzZXRBdHRyaWJ1dGUiLCJyZXNvbHZlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBsYXkiLCJ0aGVuIiwiX3dhaXRGb3JWaWRlbyIsImJpbmQiLCJyZWxlYXNlIiwidHJhY2tzIiwiZ2V0VmlkZW9UcmFja3MiLCJzdG9wIiwiZW51bWVyYXRlVmlkZW9EZXZpY2VzIiwiZGV2aWNlcyIsImtpbmQiLCJnZXRBY3RpdmVTdHJlYW1MYWJlbCIsInRyYWNrIiwiZ2V0QWN0aXZlVHJhY2siLCJhc3BlY3RSYXRpbyIsImRldmljZUlkIiwibWluQXNwZWN0UmF0aW8iLCJmYWNpbmciLCJhdWRpbyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImF0dGVtcHRzIiwiY2hlY2tWaWRlbyIsIndpbmRvdyIsIkV4aWZUYWdzIiwiQXZhaWxhYmxlVGFncyIsImZpbmRUYWdzSW5PYmplY3RVUkwiLCJzcmMiLCJ0YWdzIiwidGVzdCIsIm9iamVjdFVSTFRvQmxvYiIsImJ1ZmZlciIsImZpbmRUYWdzSW5CdWZmZXIiLCJmaWxlIiwic2VsZWN0ZWRUYWdzIiwiZGF0YVZpZXciLCJEYXRhVmlldyIsImJ5dGVMZW5ndGgiLCJleGlmVGFncyIsInNlbGVjdGVkVGFnIiwiZXhpZlRhZyIsInRhZyIsIm9mZnNldCIsImdldFVpbnQ4IiwibWFya2VyIiwicmVhZEVYSUZEYXRhIiwiZ2V0VWludDE2IiwidXJsIiwiZmV0Y2giLCJyZXNwb25zZSIsIm9rIiwiYXJyYXlCdWZmZXIiLCJzdGF0dXMiLCJzdGFydCIsInNwbGl0IiwiY2hhciIsImluZGV4IiwiY2hhckNvZGVBdCIsInRpZmZPZmZzZXQiLCJiaWdFbmQiLCJmaXJzdElGRE9mZnNldCIsImdldFVpbnQzMiIsInJlYWRUYWdzIiwiZGlyU3RhcnQiLCJzdHJpbmdzIiwiZW50cmllcyIsImVudHJ5T2Zmc2V0IiwicmVhZFRhZ1ZhbHVlIiwibnVtVmFsdWVzIiwidW5kZWZpbmVkIiwiUVVBVEVSX0NJUkNMRSIsIkZyYW1lR3JhYmJlciIsImNhbnZhcyIsIl9pbnB1dFN0cmVhbSIsIl9zdHJlYW1Db25maWciLCJfY2FudmFzV2lkdGgiLCJjYW52YXNXaWR0aCIsIl9jYW52YXNIZWlnaHQiLCJjYW52YXNIZWlnaHQiLCJfd2lkdGgiLCJfaGVpZ2h0IiwiX3RvcExlZnQiLCJ0b3BMZWZ0IiwiX2RhdGEiLCJ2aWRlb1NpemUiLCJyZWFsV2lkdGgiLCJyZWFsSGVpZ2h0IiwiY2FudmFzU2l6ZSIsImdldEZyYW1lIiwiX2FkanVzdENhbnZhc1NpemUiLCJkcmF3YWJsZSIsImRyYXdBbmdsZSIsIkhUTUxWaWRlb0VsZW1lbnQiLCJpbWFnZSIsIm9yaWVudGF0aW9uIiwiaGFsZldpZHRoIiwiaGFsZkhlaWdodCIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsIl9ncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhIiwiX2NvbXB1dGVHcmF5Iiwid2FybiIsImVuZEluZGV4Iiwib3V0V2lkdGgiLCJ0b3BSb3dJbmRleCIsImJvdHRvbVJvd0luZGV4Iiwib3V0SW1hZ2VJbmRleCIsInRvcDQiLCJib3R0b200IiwiaW1hZ2VEYXRhTGVuZ3RoIiwiSW1hZ2VMb2FkZXIiLCJiYXNlVXJpIiwic2VxdWVuY2UiLCJsb2FkZWQiLCJsb2FkZWRJbWFnZSIsIm5vdExvYWRlZEltYWdlcyIsInNwbGljZSIsImltYWdlU3JjcyIsImltYWdlTmFtZSIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwibG9hZGVkSW1hZ2VzIiwiZmlyc3RJbWFnZSIsIkltYWdlIiwib25sb2FkIiwiSW1hZ2VTdHJlYW0iLCJfYmFzZVVybCIsIl9lbmRlZCIsIl9mcmFtZUluZGV4IiwiX2ltYWdlcyIsIl9sb2FkZWQiLCJfb2Zmc2V0IiwiX3BhdXNlZCIsIl9zaXplIiwidHJpZ2dlciIsImxvYWQiLCJpbWFnZXMiLCJfY2FsY3VsYXRlZFdpZHRoIiwiX2NhbGN1bGF0ZWRIZWlnaHQiLCJfbG9hZEltYWdlcyIsInRpbWUiLCJJbnB1dFN0cmVhbSIsIl9jb21wdXRlRGl2aXNvcnMiLCJuIiwiZGl2aXNvcnMiLCJsYXJnZURpdmlzb3JzIiwiZGl2aXNvciIsInVuc2hpZnQiLCJjb25jYXQiLCJfY29tcHV0ZUNvbW1vbkRpdmlzb3JzIiwibGFyZ2VEaXZpc29yIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwid2lkZVNpZGUiLCJuck9mUGF0Y2hlc0xpc3QiLCJuck9mUGF0Y2hlc01hcCIsInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJuck9mUGF0Y2hlc0luZGV4IiwibnJPZlBhdGNoZXMiLCJkZXNpcmVkUGF0Y2hTaXplIiwiZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzIiwiZm91bmQiLCJvcHRpbWFsUGF0Y2hTaXplIiwiY2hlY2tJbWFnZUNvbnN0cmFpbnRzIiwic2hpZnQiLCJpbnB1dFN0cmVhbUNvbmZpZyIsImNvbXB1dGVJbWFnZUFyZWEiLCJzZXRDYW52YXNTaXplIiwiX3BhcnNlQ3NzRGltZW5zaW9uVmFsdWVzIiwiZGltZW5zaW9uIiwicGFyc2VGbG9hdCIsInVuaXQiLCJpbmRleE9mIiwiX2RpbWVuc2lvbnNDb252ZXJ0ZXJzIiwiaW5wdXRXaWR0aCIsImlucHV0SGVpZ2h0IiwicGFyc2VkQXJlYSIsInBhcnNlZCIsImNhbGN1bGF0ZWQiLCJfZXZlbnROYW1lcyIsIl9ldmVudEhhbmRsZXJzIiwiTWFwIiwibGlzdGVuZXIiLCJfb3B0aW9ucyIsImhhcyIsInNldCIsImNsZWFyIiwiYXJnQXJyYXkiLCJoYW5kbGVycyIsImhhbmRsZXIiLCJhcHBseSIsIkxpdmVTdHJlYW0iLCJWaWRlb1N0cmVhbSIsIl92aWRlbyIsInBhdXNlIiwib3B0aW9ucyIsIl9pbml0U2l6ZSIsImVuZGVkIiwiY3VycmVudFRpbWUiLCJpbnZlcnQiLCJtYXRyaXgiLCJhMCIsImExIiwiYTIiLCJhMyIsImRldGVybWluYW50IiwiRmxvYXQzMkFycmF5IiwidHJhbnNmb3JtV2l0aE1hdHJpeCIsIl9jb21wdXRlSGlzdG9ncmFtIiwiYml0c1BlclBpeGVsIiwiYml0U2hpZnQiLCJidWNrZXRDb3VudCIsImhpc3RvZ3JhbSIsIkludDMyQXJyYXkiLCJfZGV0ZXJtaW5lT3RzdVRocmVzaG9sZCIsImhpc3QiLCJ2ZXQiLCJweCIsImluaXQiLCJlbmQiLCJteCIsImsiLCJwMTIiLCJtMSIsIm0yIiwibTEyIiwibWF4SW5kZXgiLCJhcnJheSIsIm90c3VUaHJlc2hvbGQiLCJ0YXJnZXRXcmFwcGVyIiwidGFyZ2V0RGF0YSIsIm91dEltYWdlV3JhcHBlciIsIm91dEltYWdlIiwib3V0SW1nSW5kZXgiLCJNb21lbnRTaW1pbGFyaXR5VGhyZXNob2xkIiwiQmFyY29kZUxvY2F0b3IiLCJfbnVtUGF0Y2hlcyIsIl9pbml0QnVmZmVycyIsIl9pbml0Q2FudmFzIiwiX2N1cnJlbnRJbWFnZVdyYXBwZXIiLCJfYmluYXJpemVJbWFnZSIsInBhdGNoZXNGb3VuZCIsIl9maW5kUGF0Y2hlcyIsIm1heExhYmVsIiwiX3Jhc3Rlcml6ZUFuZ3VsYXJTaW1pbGFyaXR5IiwidG9wTGFiZWxzIiwiX2ZpbmRCaWdnZXN0Q29ubmVjdGVkQXJlYXMiLCJfZmluZEJveGVzIiwiX3BhdGNoU2l6ZSIsIl9iaW5hcnlJbWFnZVdyYXBwZXIiLCJfbGFiZWxJbWFnZVdyYXBwZXIiLCJza2VsZXRvbkltYWdlRGF0YSIsIkFycmF5QnVmZmVyIiwiX3N1YkltYWdlV3JhcHBlciIsIl9za2VsSW1hZ2VXcmFwcGVyIiwiX3NrZWxldG9uaXplciIsInNrZWxldG9uaXplciIsInNlbGYiLCJnbG9iYWwiLCJfcGF0Y2hMYWJlbEdyaWQiLCJfcGF0Y2hHcmlkIiwiX2ltYWdlVG9QYXRjaEdyaWQiLCJ1c2VXb3JrZXIiLCJfYmluYXJ5Q29udGV4dCIsInBhdGNoZXMiLCJhdmVyYWdlUmFkIiwiX2RyYXdSZWN0IiwiaW52ZXJzZU1hdHJpeCIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJ2ZXJ0ZXgiLCJ6ZXJvQm9yZGVyIiwic2hvdyIsIl9za2VsZXRvbml6ZSIsInJhc3Rlcml6ZXIiLCJSYXN0ZXJpemVyIiwicmFzdGVyUmVzdWx0IiwicmFzdGVyaXplIiwib3ZlcmxheSIsImNvdW50IiwicGF0Y2giLCJfZGVzY3JpYmVQYXRjaCIsImxhYmVsSGlzdCIsInNvcnQiLCJfYm94RnJvbVBhdGNoZXMiLCJqb2luIiwiY2x1c3Rlcml6ZSIsInRvcENsdXN0ZXIiLCJzdWJJbWFnZUFzQ29weSIsInNrZWxldG9uaXplIiwibWluQ29tcG9uZW50V2VpZ2h0IiwiY2VpbCIsImVsaWdpYmxlTW9tZW50cyIsIm1hdGNoaW5nTW9tZW50cyIsIl9zaW1pbGFyTW9tZW50cyIsImN1cnJlbnRJbmRleCIsImN1cnJlbnRQYXRjaCIsIlNlYXJjaERpcmVjdGlvbnMiLCJkaXJlY3Rpb24iLCJOdW1iZXIiLCJNQVhfVkFMVUUiLCJfdHJhY2UiLCJfbm90WWV0UHJvY2Vzc2VkIiwic3Ryb2tlUmVjdCIsIkVkZ2VMYWJlbCIsIkNvbnRvdXJEaXJlY3Rpb24iLCJsYWJlbFdyYXBwZXIiLCJfaW1hZ2VEYXRhIiwiX2xhYmVsRGF0YSIsIl90cmFjZXIiLCJUcmFjZXIiLCJkZXB0aExhYmVsIiwiY29sb3JNYXAiLCJjYyIsInNjIiwiY29ubmVjdGVkQ291bnQiLCJjeSIsImxhYmVsSW5kZXgiLCJiYyIsImN4IiwibGMiLCJjb250b3VyVHJhY2luZyIsIk91dHNpZGUiLCJDVyIsImZpcnN0VmVydGV4IiwibmV4dFBlZXIiLCJpbnNpZGVDb250b3VycyIsInByZXZpb3VzUGVlciIsIkluc2lkZSIsIkNDVyIsImZpcnN0Q29udG91ciIsInBxIiwiaXEiLCJxIiwiVW5rbm93biIsIm5leHQiLCJTa2VsZXRvbml6ZXIiLCJzdGRsaWIiLCJmb3JlaWduIiwiaW11bCIsImVyb2RlIiwiaW5JbWFnZVB0ciIsIm91dEltYWdlUHRyIiwidSIsInlTdGFydDEiLCJ5U3RhcnQyIiwieFN0YXJ0MSIsInhTdGFydDIiLCJzdWJ0cmFjdCIsImFJbWFnZVB0ciIsImJJbWFnZVB0ciIsImJpdHdpc2VPciIsImNvdW50Tm9uWmVybyIsImltYWdlUHRyIiwiZGlsYXRlIiwibWVtY3B5Iiwic3JjSW1hZ2VQdHIiLCJkc3RJbWFnZVB0ciIsInN1YkltYWdlUHRyIiwiZXJvZGVkSW1hZ2VQdHIiLCJ0ZW1wSW1hZ2VQdHIiLCJza2VsSW1hZ2VQdHIiLCJkb25lIiwiZWRnZUxhYmVsIiwic3kiLCJzeCIsIkZ2IiwidHJhY2UiLCJDdiIsImxkaXIiLCJQIiwiX2ZyYW1lR3JhYmJlciIsIl9zdG9wcGVkIiwiX2NhbnZhc0NvbnRhaW5lciIsImN0eCIsImRvbSIsIl9sb2NhdG9yIiwiX2JveFNpemUiLCJfZGVjb2RlciIsIl93b3JrZXJQb29sIiwiX29uVUlUaHJlYWQiLCJfcmVzdWx0Q29sbGVjdG9yIiwiY2IiLCJkZWZhdWx0Q29uZmlnIiwiX2luaXRpYWxpemVEYXRhIiwiX2luaXRJbnB1dFN0cmVhbSIsIl9zdGFydENvbnRpbnVvdXNVcGRhdGUiLCJfdXBkYXRlIiwiX2FkanVzdFdvcmtlclBvb2wiLCJjbGVhckV2ZW50SGFuZGxlcnMiLCJkZWNvZGVTaW5nbGUiLCJyZXN1bHRDYWxsYmFjayIsImNhbGwiLCJvbkRldGVjdGVkIiwib2ZmRGV0ZWN0ZWQiLCJ1bnN1YnNjcmliZSIsIm9uUHJvY2Vzc2VkIiwib2ZmUHJvY2Vzc2VkIiwic2V0UmVhZGVycyIsIndvcmtlciIsInBvc3RNZXNzYWdlIiwiY21kIiwicmVnaXN0ZXJSZXN1bHRDb2xsZWN0b3IiLCJyZXN1bHRDb2xsZWN0b3IiLCJhZGRSZXN1bHQiLCJ2aWV3cG9ydCIsIl9nZXRWaWV3UG9ydCIsImVyciIsIl9jYW5SZWNvcmQiLCJ0YXJnZXQiLCJIVE1MRWxlbWVudCIsInNlbGVjdG9yIiwiY2xlYXJGaXgiLCJfdHJhbnNmb3JtIiwicG9seWdvbiIsIl90cmFuc2Zvcm1SZXN1bHQiLCJfYWRkUmVzdWx0IiwiX2hhc0NvZGVSZXN1bHQiLCJfcHVibGlzaFJlc3VsdCIsInJlc3VsdFRvUHVibGlzaCIsInB1Ymxpc2giLCJfbG9jYXRlQW5kRGVjb2RlIiwiZGVjb2RlRnJvbUJvdW5kaW5nQm94ZXMiLCJhdmFpbGFibGVXb3JrZXIiLCJidXN5IiwiZ3JhYiIsImRlbGF5IiwiZnJlcXVlbmN5IiwidGltZXN0YW1wIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJfaW5pdFdvcmtlciIsImJsb2JVUkwiLCJfZ2VuZXJhdGVXb3JrZXJCbG9iIiwid29ya2VyVGhyZWFkIiwiV29ya2VyIiwib25tZXNzYWdlIiwiVVJMIiwicmV2b2tlT2JqZWN0VVJMIiwibWVzc2FnZSIsIl93b3JrZXJJbnRlcmZhY2UiLCJmYWN0b3J5IiwiUXVhZ2dhIiwiZmFjdG9yeVNvdXJjZSIsIl9fZmFjdG9yeVNvdXJjZV9fIiwiYmxvYiIsIkJsb2IiLCJ0b1N0cmluZyIsImNyZWF0ZU9iamVjdFVSTCIsImluY3JlYXNlQnkiLCJ0ZXJtaW5hdGUiLCJOIiwiVyIsIlNUQVJUX1BBVFRFUk4iLCJTVE9QX1BBVFRFUk4iLCJDT0RFX1BBVFRFUk4iLCJzdGFydFBhdHRlcm5MZW5ndGgiLCJUd29PZkZpdmVSZWFkZXIiLCJfYmFyU3BhY2VSYXRpbyIsIl9mb3JtYXQiLCJfc2luZ2xlQ29kZUVycm9yIiwiX2F2ZXJhZ2VDb2RlRXJyb3IiLCJzdGFydEluZm8iLCJfZmluZFN0YXJ0IiwiZW5kSW5mbyIsIl9maW5kRW5kIiwiY291bnRlcnMiLCJfZmlsbENvdW50ZXJzIiwiZGVjb2RlZENvZGVzIiwiY29kZSIsIl9kZWNvZGVQYXlsb2FkIiwiX25leHRTZXQiLCJfcm93IiwibmFycm93QmFyV2lkdGgiLCJfZmluZFBhdHRlcm4iLCJsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0IiwiX21hdGNoUmFuZ2UiLCJ0cmFpbGluZ1doaXRlc3BhY2VFbmQiLCJyZXZlcnNlIiwiX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZSIsImNvdW50ZXIiLCJiZXN0TWF0Y2giLCJfbWF0Y2hQYXR0ZXJuIiwiQVZFUkFHRV9DT0RFX0VSUk9SIiwiY291bnRlckxlbmd0aCIsIl9kZWNvZGVDb2RlIiwiQmFyY29kZVJlYWRlciIsIkJhcmNvZGVEaXJlY3Rpb24iLCJTdGFydE5vdEZvdW5kRXhjZXB0aW9uIiwiQ29kZU5vdEZvdW5kRXhjZXB0aW9uIiwiUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uIiwiaXNXaGl0ZSIsInRyeUhhcmRlciIsImVwc2lsb24iLCJjb3VudGVyUG9zIiwibWF4U2luZ2xlRXJyb3IiLCJtb2R1bG8iLCJTSU5HTEVfQ09ERV9FUlJPUiIsImJhcldpZHRoIiwic2NhbGVkIiwic2luZ2xlRXJyb3IiLCJjb3JyZWN0aW9uIiwiaW5kaWNlcyIsImRlY29kZSIsIlJldmVyc2UiLCJGb3J3YXJkIiwibnVtQ291bnRlcnMiLCJBTFBIQUJFVEhfU1RSSU5HIiwiQUxQSEFCRVQiLCJDSEFSQUNURVJfRU5DT0RJTkdTIiwiU1RBUlRfRU5EIiwiTUlOX0VOQ09ERURfQ0hBUlMiLCJNQVhfQUNDRVBUQUJMRSIsIlBBRERJTkciLCJDb2RhYmFyUmVhZGVyIiwiX2NvdW50ZXJzIiwiX25leHRVbnNldCIsIm5leHRTdGFydCIsInN0YXJ0Q291bnRlciIsIl90b1BhdHRlcm4iLCJkZWNvZGVkQ2hhciIsIl9wYXR0ZXJuVG9DaGFyIiwiX3ZlcmlmeVdoaXRlc3BhY2UiLCJfdmFsaWRhdGVSZXN1bHQiLCJfc3VtQ291bnRlcnMiLCJlbmRDb3VudGVyIiwiX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgiLCJjYXRlZ29yaXphdGlvbiIsInNwYWNlIiwibmFycm93IiwiY291bnRzIiwid2lkZSIsImJhciIsIl9jaGFyVG9QYXR0ZXJuIiwiY2F0IiwiZmxvb3IiLCJjaGFyQ29kZSIsIl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYmFyVGhyZXNob2xkIiwiX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZCIsInNwYWNlVGhyZXNob2xkIiwiYml0bWFzayIsIkNPREVfU0hJRlQiLCJDT0RFX0MiLCJDT0RFX0IiLCJDT0RFX0EiLCJTVEFSVF9DT0RFX0EiLCJTVEFSVF9DT0RFX0IiLCJTVEFSVF9DT0RFX0MiLCJTVE9QX0NPREUiLCJNT0RVTEVfSU5ESUNFUyIsIkNvZGUxMjhSZWFkZXIiLCJfY29ycmVjdCIsImV4cGVjdGVkIiwiX2NhbGN1bGF0ZUNvcnJlY3Rpb24iLCJfY29ycmVjdEJhcnMiLCJtdWx0aXBsaWVyIiwiY2hlY2tzdW0iLCJjb2Rlc2V0IiwicmF3UmVzdWx0Iiwic2hpZnROZXh0IiwicmVtb3ZlTGFzdENoYXJhY3RlciIsIm5vcm1hbGl6ZWQiLCJzdW1Ob3JtYWxpemVkIiwic3VtRXhwZWN0ZWQiLCJBU1RFUklTSyIsIlVpbnQxNkFycmF5IiwiQ29kZTM5UmVhZGVyIiwibGFzdFN0YXJ0IiwiX3RvQ291bnRlcnMiLCJwb3AiLCJwYXR0ZXJuU2l6ZSIsIm1pbldpZHRoIiwibWF4TmFycm93V2lkdGgiLCJudW1XaWRlQmFycyIsIndpZGVCYXJXaWR0aCIsIl9maW5kTmV4dFdpZHRoIiwicGF0dGVyblN0YXJ0Iiwid2hpdGVTcGFjZU11c3RTdGFydCIsIkNvZGUzOVZJTlJlYWRlciIsInJlcGxhY2UiLCJfY2hlY2tDaGVja3N1bSIsIkNvZGU5M1JlYWRlciIsIl92ZXJpZnlFbmQiLCJfdmVyaWZ5Q2hlY2tzdW1zIiwiX2RlY29kZUV4dGVuZGVkIiwicm91bmQiLCJjaGFyQXJyYXkiLCJuZXh0Q2hhciIsIm5leHRDaGFyQ29kZSIsIl9tYXRjaENoZWNrQ2hhciIsIm1heFdlaWdodCIsImFycmF5VG9DaGVjayIsIndlaWdodGVkU3VtcyIsIndlaWdodCIsImNoZWNrQ2hhciIsIkVBTjJSZWFkZXIiLCJyb3ciLCJjb2RlRnJlcXVlbmN5IiwiQ09ERV9HX1NUQVJUIiwicGFyc2VJbnQiLCJFQU5SZWFkZXIiLCJFQU41UmVhZGVyIiwiX2V4dGVuc2lvbkNoZWNrc3VtIiwiX2RldGVybWluZUNoZWNrRGlnaXQiLCJDSEVDS19ESUdJVF9FTkNPRElOR1MiLCJFQU44UmVhZGVyIiwiTUlERExFX1BBVFRFUk4iLCJFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiIsIkNPREVfRlJFUVVFTkNZIiwiY29kZXJhbmdlIiwiZmlyc3REaWdpdCIsIl9jYWxjdWxhdGVGaXJzdERpZ2l0IiwicmVzdWx0SW5mbyIsIl9jaGVja3N1bSIsIl9kZWNvZGVFeHRlbnNpb25zIiwibGFzdENvZGUiLCJNQVhfQ09SUkVDVElPTl9GQUNUT1IiLCJJMm9mNVJlYWRlciIsIm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgiLCJjb3VudGVyU3VtIiwiY29kZVN1bSIsImNvcnJlY3Rpb25SYXRpbyIsImNvcnJlY3Rpb25SYXRpb0ludmVyc2UiLCJjb3VudGVyMCIsImNvdW50ZXIxIiwiY29kZTAiLCJjb2RlMSIsImNvZGVfMTI4X3JlYWRlciIsImVhbl9yZWFkZXIiLCJlYW5fNV9yZWFkZXIiLCJlYW5fMl9yZWFkZXIiLCJlYW5fOF9yZWFkZXIiLCJjb2RlXzM5X3JlYWRlciIsImNvZGVfMzlfdmluX3JlYWRlciIsImNvZGFiYXJfcmVhZGVyIiwidXBjX3JlYWRlciIsIlVQQ1JlYWRlciIsInVwY19lX3JlYWRlciIsIlVQQ0VSZWFkZXIiLCJpMm9mNV9yZWFkZXIiLCJjb2RlXzkzX3JlYWRlciIsIl9kZXRlcm1pbmVQYXJpdHkiLCJuclN5c3RlbSIsImxhc3REaWdpdCIsInVwY2EiLCJfY29udmVydFRvVVBDQSIsImNoYXJBdCIsInN1YnN0cmluZyJdLCJtYXBwaW5ncyI6Ijs7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRCxXO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0M7Ozs7Ozs7Ozs7O0FDVkE7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0wsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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NkQ7QUFDekQsaUJBQU9iLE9BQVA7QUFDSDtBQUNKOztBQUVELGFBQU8sSUFBUDtBQUNIO0FBcEZMOztBQUFBO0FBQUEsRUFBZ0MySSxxREFBaEMsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSkE7QUFFTyxJQUFNb0MsU0FBYjtBQUFBO0FBQUE7QUFBQTs7QUFDSSxxQkFBWTk2QixNQUFaLEVBQTBDeU8sV0FBMUMsRUFBOEU7QUFBQTs7QUFBQTs7QUFDMUUsNk1BQU16TyxNQUFOLEVBQWN5TyxXQUFkO0FBRUEsVUFBS2loQixPQUFMLEdBQWUsT0FBZjtBQUgwRTtBQUk3RTs7QUFMTDtBQUFBO0FBQUEsNkJBT3NCO0FBQ2QsVUFBTXZ1QixNQUFNLEdBQUcsK0xBQWY7O0FBRUEsVUFBSUEsTUFBTSxJQUFJQSxNQUFNLENBQUNpdkIsSUFBakIsSUFBeUJqdkIsTUFBTSxDQUFDaXZCLElBQVAsQ0FBWTVzQixNQUFaLEtBQXVCLEVBQWhELElBQXNEckMsTUFBTSxDQUFDaXZCLElBQVAsQ0FBWW9MLE1BQVosQ0FBbUIsQ0FBbkIsTUFBMEIsR0FBcEYsRUFBeUY7QUFDckZyNkIsY0FBTSxDQUFDaXZCLElBQVAsR0FBY2p2QixNQUFNLENBQUNpdkIsSUFBUCxDQUFZcUwsU0FBWixDQUFzQixDQUF0QixDQUFkO0FBQ0EsZUFBT3Q2QixNQUFQO0FBQ0g7O0FBRUQsYUFBTyxJQUFQO0FBQ0g7QUFoQkw7O0FBQUE7QUFBQSxFQUErQnUzQixxREFBL0IsRSIsImZpbGUiOiJxdWFnZ2EuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoZmFjdG9yeS50b1N0cmluZygpKS5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGV4cG9ydHNbXCJRdWFnZ2FcIl0gPSBmYWN0b3J5KGZhY3RvcnkudG9TdHJpbmcoKSkuZGVmYXVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByb290W1wiUXVhZ2dhXCJdID0gZmFjdG9yeShmYWN0b3J5LnRvU3RyaW5nKCkpLmRlZmF1bHQ7XG4gICAgfVxufSkodGhpcywgZnVuY3Rpb24oX19mYWN0b3J5U291cmNlX18pIHtcbiAgICByZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3F1YWdnYS50c1wiKTtcbiIsImZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDsiLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvcjsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc0NhbGxDaGVjazsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIHN1cGVyUHJvcEJhc2UgPSByZXF1aXJlKFwiLi9zdXBlclByb3BCYXNlXCIpO1xuXG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LmdldCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IFJlZmxlY3QuZ2V0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwidmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2Y7IiwidmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc3VwZXJQcm9wQmFzZTsiLCJ2YXIgYXJyYXlXaXRob3V0SG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhvdXRIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWRcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdG9Db25zdW1hYmxlQXJyYXk7IiwiZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mMihTeW1ib2wuaXRlcmF0b3IpID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcyB8fCAodHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgJiYgc2VsZik7XG59KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbiAgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJpbXBvcnQgeyBJbWFnZURlYnVnIH0gZnJvbSAnLi4vY29tbW9uL2ltYWdlLWRlYnVnJztcbmltcG9ydCB7IFF1YWdnYUJhcmNvZGUgfSBmcm9tICcuLi9kZWNvZGVyL2JhcmNvZGUtZGVjb2Rlcic7XG5pbXBvcnQgeyBCYXJjb2RlIH0gZnJvbSAnLi4vcmVhZGVyL2JhcmNvZGUtcmVhZGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHRDb2xsZWN0b3JDb25maWcge1xuICAgIGNhcGFjaXR5PzogbnVtYmVyO1xuICAgIGNhcHR1cmU/OiBib29sZWFuO1xuICAgIGJsYWNrbGlzdD86IEFycmF5PEJhcmNvZGU+O1xuICAgIGZpbHRlcj86IChpdGVtOiBCYXJjb2RlKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzdWx0Q29sbGVjdG9yIHtcbiAgICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIHByaXZhdGUgX2NvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICBwcml2YXRlIF9jb25maWc6IFJlc3VsdENvbGxlY3RvckNvbmZpZztcbiAgICBwcml2YXRlIF9jYXBhY2l0eTogbnVtYmVyO1xuICAgIHByaXZhdGUgX2NhcHR1cmU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfcmVzdWx0czogQXJyYXk8UXVhZ2dhQmFyY29kZT47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlc3VsdENvbGxlY3RvckNvbmZpZykge1xuICAgICAgICB0aGlzLl9yZXN1bHRzID0gbmV3IEFycmF5PFF1YWdnYUJhcmNvZGU+KCk7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5fY2FwYWNpdHkgPSBjb25maWcuY2FwYWNpdHkgfHwgMjA7XG4gICAgICAgIHRoaXMuX2NhcHR1cmUgPSBjb25maWcuY2FwdHVyZSA9PT0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRSZXN1bHQoZGF0YTogVWludDhBcnJheSwgaW1hZ2VXaWR0aDogbnVtYmVyLCBpbWFnZUhlaWdodDogbnVtYmVyLCBjb2RlUmVzdWx0OiBCYXJjb2RlKTogdm9pZCB7XG4gICAgICAgIGlmIChjb2RlUmVzdWx0ICYmIHRoaXMuX2NhcGFjaXR5ICYmICF0aGlzLl9jb250YWlucyhjb2RlUmVzdWx0KSAmJiB0aGlzLl9wYXNzZXNGaWx0ZXIoY29kZVJlc3VsdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUXVhZ2dhQmFyY29kZSA9IHsgY29kZVJlc3VsdCB9O1xuXG4gICAgICAgICAgICB0aGlzLl9jYXBhY2l0eS0tO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IGltYWdlV2lkdGg7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IGltYWdlSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3SW1hZ2UoZGF0YSwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZyYW1lID0gdGhpcy5fY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJlc3VsdHMoKTogQXJyYXk8UXVhZ2dhQmFyY29kZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb250YWlucyhjb2RlUmVzdWx0OiBCYXJjb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuYmxhY2tsaXN0ICYmXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuYmxhY2tsaXN0LnNvbWUoaXRlbSA9PiBPYmplY3Qua2V5cyhpdGVtKS5ldmVyeShrZXkgPT4gaXRlbVtrZXldID09PSBjb2RlUmVzdWx0W2tleV0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXNzZXNGaWx0ZXIoY29kZVJlc3VsdDogQmFyY29kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2NvbmZpZy5maWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5fY29uZmlnLmZpbHRlcihjb2RlUmVzdWx0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBNb21lbnQgfSBmcm9tICcuL21vbWVudCc7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgY2x1c3RlciBmb3IgZ3JvdXBpbmcgc2ltaWxhciBvcmllbnRhdGlvbnMgb2YgbW9tZW50c1xuICovXG5leHBvcnQgY2xhc3MgQ2x1c3RlciB7XG4gICAgcHJpdmF0ZSBfdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbW9tZW50czogQXJyYXk8TW9tZW50PjtcbiAgICBwcml2YXRlIF9jZW50ZXI6IE1vbWVudDtcblxuICAgIHN0YXRpYyBjbHVzdGVyaXplKG1vbWVudHM6IEFycmF5PE1vbWVudD4sIHRocmVzaG9sZDogbnVtYmVyKTogQXJyYXk8Q2x1c3Rlcj4ge1xuICAgICAgICBjb25zdCBjbHVzdGVycyA9IG5ldyBBcnJheTxDbHVzdGVyPigpO1xuXG4gICAgICAgIG1vbWVudHMuZm9yRWFjaChtb21lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdDbHVzdGVyID0gY2x1c3RlcnMuZmluZChjbHVzdGVyID0+IGNsdXN0ZXIuZml0cyhtb21lbnQpKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nQ2x1c3Rlci5hZGQobW9tZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChuZXcgQ2x1c3Rlcih0aHJlc2hvbGQsIG1vbWVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2x1c3RlcnM7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IodGhyZXNob2xkOiBudW1iZXIsIG1vbWVudDogTW9tZW50KSB7XG4gICAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5fbW9tZW50cyA9IG5ldyBBcnJheTxNb21lbnQ+KCk7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IHtcbiAgICAgICAgICAgIHJhZDogMCxcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1vbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hZGQobW9tZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZChwb2ludDogTW9tZW50KSB7XG4gICAgICAgIHRoaXMuX21vbWVudHMucHVzaChwb2ludCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNlbnRlclxuICAgICAgICB0aGlzLl9jZW50ZXIucmFkID0gdGhpcy5fbW9tZW50cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5yYWQsIDApIC8gdGhpcy5fbW9tZW50cy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2NlbnRlci54ID0gTWF0aC5jb3ModGhpcy5fY2VudGVyLnJhZCk7XG4gICAgICAgIHRoaXMuX2NlbnRlci55ID0gTWF0aC5zaW4odGhpcy5fY2VudGVyLnJhZCk7XG4gICAgfVxuXG4gICAgZml0cyhtb21lbnQ6IE1vbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBjaGVjayBjb3NpbmUgc2ltaWxhcml0eSB0byBjZW50ZXItYW5nbGVcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IE1hdGguYWJzKG1vbWVudC54ICogdGhpcy5fY2VudGVyLnggKyBtb21lbnQueSAqIHRoaXMuX2NlbnRlci55KTtcbiAgICAgICAgcmV0dXJuIHNpbWlsYXJpdHkgPiB0aGlzLl90aHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgZ2V0IG1vbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb21lbnRzO1xuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRXZlbnRDYWxsYmFjayB7XG4gICAgKGRhdGE6IGFueSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTdWJzY3JpcHRpb24ge1xuICAgIGNhbGxiYWNrOiBFdmVudENhbGxiYWNrO1xuICAgIGFzeW5jPzogYm9vbGVhbjtcbiAgICBvbmNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEV2ZW50SXRlbSB7XG4gICAgc3Vic2NyaXB0aW9uczogQXJyYXk8RXZlbnRTdWJzY3JpcHRpb24+XG59XG5cbmxldCBldmVudHM6IHsgW25hbWU6IHN0cmluZ106IEV2ZW50SXRlbSB9ID0ge307XG5cbmV4cG9ydCBjbGFzcyBFdmVudHMge1xuICAgIHN0YXRpYyBzdWJzY3JpYmUoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50U3Vic2NyaXB0aW9uIHwgRXZlbnRDYWxsYmFjaywgYXN5bmM/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb246IEV2ZW50U3Vic2NyaXB0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICBhc3luY1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnQ2FsbGJhY2sgd2FzIG5vdCBzcGVjaWZpZWQgb24gb3B0aW9ucyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZXRFdmVudChldmVudCkuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgc3RhdGljIHB1Ymxpc2godHlwZTogc3RyaW5nLCBkYXRhPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50SXRlbSA9IGdldEV2ZW50KHR5cGUpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gZXZlbnRJdGVtLnN1YnNjcmlwdGlvbnM7XG5cbiAgICAgICAgLy8gUHVibGlzaCBvbmUtdGltZSBzdWJzY3JpcHRpb25zXG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZmlsdGVyKCh7IG9uY2UgfSkgPT4gISFvbmNlKS5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgZGF0YSkpO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGVtIGZyb20gdGhlIHN1YnNjcmlwdGlvblxuICAgICAgICBldmVudEl0ZW0uc3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnMuZmlsdGVyKCh7IG9uY2UgfSkgPT4gIW9uY2UpO1xuXG4gICAgICAgIC8vIHB1Ymxpc2ggdGhlIHJlc3RcbiAgICAgICAgZXZlbnRJdGVtLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIGRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgb25jZShldmVudDogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRDYWxsYmFjaywgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoZXZlbnQsIHsgY2FsbGJhY2ssIGFzeW5jLCBvbmNlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyB1bnN1YnNjcmliZShldmVudE5hbWU/OiBzdHJpbmcsIGNhbGxiYWNrPzogRXZlbnRDYWxsYmFjaykge1xuICAgICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAoZXZlbnQgJiYgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBldmVudC5zdWJzY3JpcHRpb25zID0gZXZlbnQuc3Vic2NyaXB0aW9ucy5maWx0ZXIoc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiBFdmVudEl0ZW0ge1xuICAgIGlmICghZXZlbnRzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgZXZlbnRzW2V2ZW50TmFtZV0gPSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzW2V2ZW50TmFtZV07XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBFdmVudFN1YnNjcmlwdGlvbiwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5hc3luYykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfSwgNCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbn1cbiIsImV4cG9ydCB0eXBlIEhTViA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgUkdCID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaHN2MnJnYihoc3Y6IEhTViwgcmdiPzogUkdCKTogUkdCIHtcbiAgICBjb25zdCBoID0gaHN2WzBdO1xuICAgIGNvbnN0IHMgPSBoc3ZbMV07XG4gICAgY29uc3QgdiA9IGhzdlsyXTtcbiAgICBjb25zdCBjID0gdiAqIHM7XG4gICAgY29uc3QgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChoIC8gNjApICUgMiAtIDEpKTtcbiAgICBjb25zdCBtID0gdiAtIGM7XG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBpZiAoaCA8IDYwKSB7XG4gICAgICAgIHIgPSBjO1xuICAgICAgICBnID0geDtcbiAgICB9IGVsc2UgaWYgKGggPCAxMjApIHtcbiAgICAgICAgciA9IHg7XG4gICAgICAgIGcgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDE4MCkge1xuICAgICAgICBnID0gYztcbiAgICAgICAgYiA9IHg7XG4gICAgfSBlbHNlIGlmIChoIDwgMjQwKSB7XG4gICAgICAgIGcgPSB4O1xuICAgICAgICBiID0gYztcbiAgICB9IGVsc2UgaWYgKGggPCAzMDApIHtcbiAgICAgICAgciA9IHg7XG4gICAgICAgIGIgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDM2MCkge1xuICAgICAgICByID0gYztcbiAgICAgICAgYiA9IHg7XG4gICAgfVxuXG4gICAgcmdiID0gcmdiIHx8IFswLCAwLCAwXTtcblxuICAgIHJnYlswXSA9IChyICsgbSkgKiAyNTUgfCAwO1xuICAgIHJnYlsxXSA9IChnICsgbSkgKiAyNTUgfCAwO1xuICAgIHJnYlsyXSA9IChiICsgbSkgKiAyNTUgfCAwO1xuXG4gICAgcmV0dXJuIHJnYjtcbn1cbiIsImltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi9wb2ludCc7XG5cbmV4cG9ydCBjb25zdCBJbWFnZURlYnVnID0ge1xuICAgIGRyYXdQYXRoKHBhdGg6IEFycmF5PFBvaW50PiwgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBjb250ZXh0Lm1vdmVUbyhwYXRoWzBdLngsIHBhdGhbMF0ueSk7XG4gICAgICAgICAgICBwYXRoLnNsaWNlKDEpLmZvckVhY2goKHsgeCwgeSB9KSA9PiBjb250ZXh0LmxpbmVUbyh4LCB5KSk7XG4gICAgICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3SW1hZ2UoaW1hZ2VEYXRhOiBVaW50OEFycmF5LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNhbnZhc0RhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNhbnZhc0RhdGEuZGF0YTtcbiAgICAgICAgbGV0IGltYWdlSW5kZXggPSBpbWFnZURhdGEubGVuZ3RoIHwgMDtcbiAgICAgICAgbGV0IGNhbnZhc0luZGV4ID0gZGF0YS5sZW5ndGggfCAwO1xuXG4gICAgICAgIGlmIChjYW52YXNJbmRleCAvIGltYWdlSW5kZXggIT09IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChpbWFnZUluZGV4LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW1hZ2VEYXRhW2ltYWdlSW5kZXhdO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0luZGV4XSA9IDI1NTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNJbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNJbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNJbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGNhbnZhc0RhdGEsIDAsIDApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IE1vbWVudCB9IGZyb20gJy4vbW9tZW50JztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi9wb2ludCc7XG5pbXBvcnQgeyBIU1YsIGhzdjJyZ2IsIFJHQiB9IGZyb20gJy4vaHN2MnJnYic7XG5cbnR5cGUgQXJyYXlUeXBlID0gQXJyYXk8bnVtYmVyPiB8IFVpbnQ4QXJyYXkgfCBJbnQzMkFycmF5O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYXNpYyBpbWFnZSBjb21iaW5pbmcgdGhlIGRhdGEgYW5kIHNpemUuXG4gKiBJbiBhZGRpdGlvbiwgc29tZSBtZXRob2RzIGZvciBtYW5pcHVsYXRpb24gYXJlIGNvbnRhaW5lZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlV3JhcHBlcjxUIGV4dGVuZHMgQXJyYXlUeXBlID0gVWludDhBcnJheT4ge1xuICAgIGRhdGE6IFQgfCBVaW50OEFycmF5O1xuICAgIHNpemU6IFBvaW50O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgb2YgdGhlIGltYWdlIGluIHBpeGVsXG4gICAgICogQHBhcmFtIGRhdGEgSWYgZ2l2ZW4sIGEgZmxhdCBhcnJheSBjb250YWluaW5nIHRoZSBwaXhlbCBkYXRhXG4gICAgICogQHBhcmFtIGFycmF5VHlwZSBJZiBnaXZlbiwgdGhlIGRlc2lyZWQgRGF0YVR5cGUgb2YgdGhlIEFycmF5IChtYXkgYmUgdHlwZWQvbm9uLXR5cGVkKVxuICAgICAqIEBwYXJhbSBpbml0aWFsaXplIEluZGljYXRpbmcgaWYgdGhlIGFycmF5IHNob3VsZCBiZSBpbml0aWFsaXplZCBvbiBjcmVhdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzaXplOiBQb2ludCwgZGF0YT86IFQsIGFycmF5VHlwZT86IHsgbmV3KF86IG51bWJlcik6IFQgfCBVaW50OEFycmF5IH0sIGluaXRpYWxpemU/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IChhcnJheVR5cGUgfHwgVWludDhBcnJheSkoc2l6ZS54ICogc2l6ZS55KTtcblxuICAgICAgICAgICAgaWYgKGluaXRpYWxpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsbCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIGEgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBpbWFnZSB3aXRoIGEgZ2l2ZW4gb2Zmc2V0XG4gICAgICogQHBhcmFtIHBvaW50IFRoZSBsb2NhdGlvbiB0byB0ZXN0XG4gICAgICogQHBhcmFtIGJvcmRlciBUaGUgcGFkZGluZyB2YWx1ZSBpbiBwaXhlbHNcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvY2F0aW9uIGluc2lkZSB0aGUgaW1hZ2UncyBib3JkZXIsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBzZWUgY3ZkL2ltYWdlLmhcbiAgICAgKi9cbiAgICBpbkltYWdlV2l0aEJvcmRlcihwb2ludDogUG9pbnQsIGJvcmRlcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAocG9pbnQueCA+PSBib3JkZXIpXG4gICAgICAgICAgICAmJiAocG9pbnQueSA+PSBib3JkZXIpXG4gICAgICAgICAgICAmJiAocG9pbnQueCA8ICh0aGlzLnNpemUueCAtIGJvcmRlcikpXG4gICAgICAgICAgICAmJiAocG9pbnQueSA8ICh0aGlzLnNpemUueSAtIGJvcmRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4ge0ltYWdlV3JhcHBlcikgYW5kIGNvcGllcyB0aGUgbmVlZGVkIHVuZGVybHlpbmcgaW1hZ2UtZGF0YSBhcmVhXG4gICAgICogQHBhcmFtIGltYWdlV3JhcHBlciBUaGUgdGFyZ2V0IHtJbWFnZVdyYXBwZXJ9IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSBjb3BpZWRcbiAgICAgKiBAcGFyYW0gZnJvbVggVGhlIGhvcml6b250YWwgcG9zaXRpb24gd2hlcmUgdG8gY29weSBmcm9tXG4gICAgICogQHBhcmFtIGZyb21ZIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB3aGVyZSB0byBjb3B5IGZyb21cbiAgICAqL1xuICAgIHN1YkltYWdlQXNDb3B5KGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyLCBmcm9tWDogbnVtYmVyLCBmcm9tWTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNpemVZID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICAgICAgY29uc3Qgc2l6ZVggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgc2l6ZVg7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplWTsgeSsrKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGFbeSAqIHNpemVYICsgeF0gPSB0aGlzLmRhdGFbKGZyb21ZICsgeSkgKiB0aGlzLnNpemUueCArIGZyb21YICsgeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSBnaXZlbiBwaXhlbCBwb3NpdGlvbiBmcm9tIHRoZSBpbWFnZVxuICAgICAqIEBwYXJhbSB4IFRoZSB4LXBvc2l0aW9uXG4gICAgICogQHBhcmFtIHkgVGhlIHktcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBUaGUgZ3JheXNjYWxlIHZhbHVlIGF0IHRoZSBwaXhlbC1wb3NpdGlvblxuICAgICAqL1xuICAgIGdldCh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbeSAqIHRoaXMuc2l6ZS54ICsgeF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGdpdmVuIHBpeGVsIHBvc2l0aW9uIGluIHRoZSBpbWFnZVxuICAgICAqIEBwYXJhbSB4IFRoZSB4LXBvc2l0aW9uXG4gICAgICogQHBhcmFtIHkgVGhlIHktcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGdyYXlzY2FsZSB2YWx1ZSB0byBzZXRcbiAgICAgKiBAcmV0dXJucyBUaGUgSW1hZ2UgaXRzZWxmIChmb3IgcG9zc2libGUgY2hhaW5pbmcpXG4gICAgICovXG4gICAgc2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogSW1hZ2VXcmFwcGVyPFQ+IHtcbiAgICAgICAgdGhpcy5kYXRhW3kgKiB0aGlzLnNpemUueCArIHhdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJvcmRlciBvZiB0aGUgaW1hZ2UgKDEgcGl4ZWwpIHRvIHplcm9cbiAgICAgKi9cbiAgICB6ZXJvQm9yZGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZS54O1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnNpemUueTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBkYXRhWyhoZWlnaHQgLSAxKSAqIHdpZHRoICsgaV0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZWlnaHQgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaSAqIHdpZHRoXSA9IGRhdGFbaSAqIHdpZHRoICsgKHdpZHRoIC0gMSldID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludmVydHMgYSBiaW5hcnkgaW1hZ2UgaW4gcGxhY2VcbiAgICAgKi9cbiAgICBpbnZlcnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpXSA/IDAgOiAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbW9tZW50cyhsYWJlbENvdW50OiBudW1iZXIpOiBBcnJheTxNb21lbnQ+IHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5zaXplLng7XG4gICAgICAgIGNvbnN0IGxhYmVsU3VtID0gbmV3IEFycmF5PE1vbWVudD4oKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PE1vbWVudD4oKTtcblxuICAgICAgICBpZiAobGFiZWxDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxhYmVsU3VtW2ldID0ge1xuICAgICAgICAgICAgICAgIG0wMDogMCxcbiAgICAgICAgICAgICAgICBtMDE6IDAsXG4gICAgICAgICAgICAgICAgbTEwOiAwLFxuICAgICAgICAgICAgICAgIG0xMTogMCxcbiAgICAgICAgICAgICAgICBtMDI6IDAsXG4gICAgICAgICAgICAgICAgbTIwOiAwLFxuICAgICAgICAgICAgICAgIHRoZXRhOiAwLFxuICAgICAgICAgICAgICAgIHJhZDogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHlzcSA9IHkgKiB5O1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5kYXRhW3kgKiB3aWR0aCArIHhdO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxTdW1bdmFsIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0wMCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMDEgKz0geTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTEwICs9IHg7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0xMSArPSB4ICogeTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTAyICs9IHlzcTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTIwICs9IHggKiB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcbiAgICAgICAgY29uc3QgUElfNCA9IFBJIC8gNDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhYmVsQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbFN1bVtpXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4obGFiZWwubTAwKSAmJiBsYWJlbC5tMDAgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4XyA9IGxhYmVsLm0xMCAvIGxhYmVsLm0wMDtcbiAgICAgICAgICAgICAgICBjb25zdCB5XyA9IGxhYmVsLm0wMSAvIGxhYmVsLm0wMDtcbiAgICAgICAgICAgICAgICBjb25zdCBtdTExID0gbGFiZWwubTExIC8gbGFiZWwubTAwIC0geF8gKiB5XztcbiAgICAgICAgICAgICAgICBjb25zdCBtdTAyID0gbGFiZWwubTAyIC8gbGFiZWwubTAwIC0geV8gKiB5XztcbiAgICAgICAgICAgICAgICBjb25zdCBtdTIwID0gbGFiZWwubTIwIC8gbGFiZWwubTAwIC0geF8gKiB4XztcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSAwLjUgKiBNYXRoLmF0YW4oKG11MDIgLSBtdTIwKSAvICgyICogbXUxMSkpICsgKG11MTEgPj0gMCA/IFBJXzQgOiAtUElfNCkgKyBQSTtcbiAgICAgICAgICAgICAgICBsYWJlbC50aGV0YSA9ICh0bXAgKiAxODAgLyBQSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC50aGV0YSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwudGhldGEgKz0gMTgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYWJlbC5yYWQgPSB0bXAgPiBQSSA/IHRtcCAtIFBJIDogdG1wO1xuICAgICAgICAgICAgICAgIGxhYmVsLnggPSBNYXRoLmNvcyh0bXApO1xuICAgICAgICAgICAgICAgIGxhYmVsLnkgPSBNYXRoLnNpbih0bXApO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgdGhlIHtJbWFnZVdyYXBwZXJ9IGluIGEgZ2l2ZW4gY2FudmFzXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHJlbmRlcmluZyBjb250ZXh0IHRvIHdyaXRlIHRvXG4gICAgICogQHBhcmFtIHNjYWxlIFNjYWxlIHdoaWNoIGlzIGFwcGxpZWQgdG8gZWFjaCBwaXhlbC12YWx1ZVxuICAgICAqL1xuICAgIHNob3coY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuc2l6ZS55O1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZS54O1xuICAgICAgICAvLyBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIC8vIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIC8vIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjb25zdCBmcmFtZSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCBkYXRhID0gZnJhbWUuZGF0YTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSAwO1xuXG4gICAgICAgIGlmICghc2NhbGUpIHtcbiAgICAgICAgICAgIHNjYWxlID0gMS4wO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB5ICogd2lkdGggKyB4O1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmdldCh4LCB5KSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgMF0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgMV0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgMl0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIGRhdGFbcGl4ZWwgKiA0ICsgM10gPSAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZyYW1lLmRhdGEgPSBkYXRhO1xuICAgICAgICBjb250ZXh0LnB1dEltYWdlRGF0YShmcmFtZSwgMCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgdGhlIHBhcnQgb2YgdGhlIGltYWdlIGluIGEgZ2l2ZW4gY2FudmFzXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHJlbmRlcmluZyBjb250ZXh0IHRvIHdyaXRlIHRvXG4gICAgICogQHBhcmFtIHNjYWxlIFNjYWxlIHdoaWNoIGlzIGFwcGxpZWQgdG8gZWFjaCBwaXhlbC12YWx1ZVxuICAgICAqIEBwYXJhbSBmcm9tWCBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiB3aGVyZSB0byBvdmVybGF5IGZyb21cbiAgICAgKiBAcGFyYW0gZnJvbVkgVGhlIHZlcnRpY2FsIHBvc2l0aW9uIHdoZXJlIHRvIG92ZXJsYXkgZnJvbVxuICAgICAqL1xuICAgIG92ZXJsYXkoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzY2FsZTogbnVtYmVyLCBmcm9tWDogbnVtYmVyLCBmcm9tWTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhzdjogSFNWID0gWzAsIDEsIDFdO1xuICAgICAgICBjb25zdCB3aGl0ZVJnYjogUkdCID0gWzI1NSwgMjU1LCAyNTVdO1xuICAgICAgICBjb25zdCBibGFja1JnYjogUkdCID0gWzAsIDAsIDBdO1xuICAgICAgICBjb25zdCBmcmFtZSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKGZyb21YLCBmcm9tWSwgdGhpcy5zaXplLngsIHRoaXMuc2l6ZS55KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGZyYW1lLmRhdGE7XG5cbiAgICAgICAgaWYgKCFzY2FsZSB8fCBzY2FsZSA8IDAgfHwgc2NhbGUgPiAzNjApIHtcbiAgICAgICAgICAgIHNjYWxlID0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgbGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsgbGVuZ3RoLS07KSB7XG4gICAgICAgICAgICBoc3ZbMF0gPSB0aGlzLmRhdGFbbGVuZ3RoXSAqIHNjYWxlO1xuICAgICAgICAgICAgY29uc3QgcmdiOiBSR0IgPSBoc3ZbMF0gPD0gMCA/IHdoaXRlUmdiIDogaHN2WzBdID49IDM2MCA/IGJsYWNrUmdiIDogaHN2MnJnYihoc3YpO1xuICAgICAgICAgICAgZGF0YVtsZW5ndGggKiA0ICsgMF0gPSByZ2JbMF07XG4gICAgICAgICAgICBkYXRhW2xlbmd0aCAqIDQgKyAxXSA9IHJnYlsxXTtcbiAgICAgICAgICAgIGRhdGFbbGVuZ3RoICogNCArIDJdID0gcmdiWzJdO1xuICAgICAgICAgICAgZGF0YVtsZW5ndGggKiA0ICsgM10gPSAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnB1dEltYWdlRGF0YShmcmFtZSwgZnJvbVgsIGZyb21ZKTtcbiAgICB9XG59XG4iLCJcbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVEZXZpY2VzKCk6IFByb21pc2U8QXJyYXk8TWVkaWFEZXZpY2VJbmZvPj4ge1xuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIHR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlbnVtZXJhdGVEZXZpY2VzIGlzIG5vdCBkZWZpbmVkJykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzOiBNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIHR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdnZXRVc2VyTWVkaWEgaXMgbm90IGRlZmluZWQnKSk7XG59XG4iLCIvKipcbiAqIFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBvZiBvYmplY3RzIGFuZCByZXR1cm5zIG5ldyBvYmplY3QuXG4gKiBEb2VzIG5vdCBtb2RpZnkgb2JqZWN0cyAoaW1tdXRhYmxlKS5cbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ4MjE4MjA5XG4gKlxuICogQHBhcmFtIG9iamVjdHMgLSBPYmplY3RzIHRvIG1lcmdlXG4gKiBAcmV0dXJucyBOZXcgb2JqZWN0IHdpdGggbWVyZ2VkIGtleS92YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKC4uLm9iamVjdHM6IFJlYWRvbmx5QXJyYXk8YW55Pik6IG9iamVjdCB7XG4gICAgY29uc3QgaXNPYmplY3QgPSAob2JqOiB1bmtub3duKSA9PiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7XG5cbiAgICByZXR1cm4gb2JqZWN0cy5yZWR1Y2UoKHByZXYsIG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwVmFsID0gcHJldltrZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9WYWwgPSBvYmpba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBWYWwpICYmIEFycmF5LmlzQXJyYXkob1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldltrZXldID0gcFZhbC5jb25jYXQoLi4ub1ZhbCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZba2V5XSA9IG9WYWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwVmFsKSAmJiBpc09iamVjdChvVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2W2tleV0gPSBtZXJnZShwVmFsLCBvVmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2W2tleV0gPSBvVmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwge30pO1xufSIsImltcG9ydCB7IFF1YWdnYUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogUXVhZ2dhQ29uZmlnID0ge1xuICAgIGlucHV0U3RyZWFtOiB7XG4gICAgICAgIG5hbWU6ICdMaXZlJyxcbiAgICAgICAgdHlwZTogJ0xpdmVTdHJlYW0nLFxuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgLy8gYXNwZWN0UmF0aW86IDY0MC80ODAsIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICBmYWNpbmdNb2RlOiAnZW52aXJvbm1lbnQnIC8vIG9yIHVzZXJcbiAgICAgICAgICAgIC8vIGRldmljZUlkOiAnMzg3NDU5ODM0NTczODc1OTgzNzU5ODM3NTk4MzQnXG4gICAgICAgIH0sXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJ1xuICAgICAgICB9LFxuICAgICAgICBzaW5nbGVDaGFubmVsOiBmYWxzZSAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiAwLFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcidcbiAgICAgICAgXSxcbiAgICAgICAgZGVidWc6IHtcbiAgICAgICAgICAgIGRyYXdCb3VuZGluZ0JveDogZmFsc2UsXG4gICAgICAgICAgICBzaG93RnJlcXVlbmN5OiBmYWxzZSxcbiAgICAgICAgICAgIGRyYXdTY2FubGluZTogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0dGVybjogZmFsc2VcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgc2hvd0NhbnZhczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0Y2hlczogZmFsc2UsXG4gICAgICAgICAgICBzaG93Rm91bmRQYXRjaGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dTa2VsZXRvbjogZmFsc2UsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dQYXRjaExhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgYm94RnJvbVBhdGNoZXM6IHtcbiAgICAgICAgICAgICAgICBzaG93VHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dUcmFuc2Zvcm1lZEJveDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd0JCOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbiIsImltcG9ydCB7IEJveCB9IGZyb20gJy4uL2NvbW1vbi9ib3gnO1xuaW1wb3J0IHsgSW1hZ2VXcmFwcGVyIH0gZnJvbSAnLi4vY29tbW9uL2ltYWdlLXdyYXBwZXInO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9jb21tb24vcG9pbnQnO1xuaW1wb3J0IHsgUmVhZGVycyB9IGZyb20gJy4uL3JlYWRlci9pbmRleCc7XG5pbXBvcnQgeyBCYXJjb2RlLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnLCBCYXJjb2RlUmVhZGVyRGVjbGFyYXRpb24sIEJhcmNvZGVSZWFkZXJUeXBlIH0gZnJvbSAnLi4vcmVhZGVyL2JhcmNvZGUtcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVMaW5lLCBCcmVzZW5oYW0gfSBmcm9tICcuL2JyZXNlbmhhbSc7XG5pbXBvcnQgeyBJbWFnZURlYnVnIH0gZnJvbSAnLi4vY29tbW9uL2ltYWdlLWRlYnVnJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlRGVjb2RlckNvbmZpZyB7XG4gICAgZGVidWc/OiB7XG4gICAgICAgIGRyYXdCb3VuZGluZ0JveD86IGJvb2xlYW47XG4gICAgICAgIGRyYXdTY2FubGluZT86IGJvb2xlYW47XG4gICAgICAgIHNob3dGcmVxdWVuY3k/OiBib29sZWFuO1xuICAgICAgICBzaG93UGF0dGVybj86IGJvb2xlYW47XG4gICAgfTtcbiAgICBtdWx0aXBsZT86IGJvb2xlYW47XG4gICAgcmVhZGVycz86IEFycmF5PEJhcmNvZGVSZWFkZXJEZWNsYXJhdGlvbj47XG59XG5cbnR5cGUgTGluZSA9IFtQb2ludCwgUG9pbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1YWdnYUJhcmNvZGUge1xuICAgIGFuZ2xlPzogbnVtYmVyO1xuICAgIGJhcmNvZGVzPzogQXJyYXk8UXVhZ2dhQmFyY29kZT47IC8vIFRPT0Q6IGRlYWwgd2l0aCBtdWx0aXBsZSByZXN1bHRzXG4gICAgYm94PzogQm94O1xuICAgIGJveGVzPzogQXJyYXk8Qm94PjsgLy8gVE9PRDogZGVhbCB3aXRoIG11bHRpcGxlIHJlc3VsdHNcbiAgICBjb2RlUmVzdWx0PzogQmFyY29kZTtcbiAgICBmcmFtZT86IHN0cmluZztcbiAgICBsaW5lPzogTGluZTtcbiAgICBwYXR0ZXJuPzogQXJyYXk8bnVtYmVyPjtcbiAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG59O1xuXG5pbnRlcmZhY2UgQmFyY29kZUFuZEJhcmNvZGVMaW5lIHtcbiAgICBjb2RlUmVzdWx0OiBCYXJjb2RlO1xuICAgIGJhcmNvZGVMaW5lOiBCYXJjb2RlTGluZTtcbn1cblxuZXhwb3J0IGNsYXNzIEJhcmNvZGVEZWNvZGVyIHtcbiAgICBwcml2YXRlIF9jb25maWc6IEJhcmNvZGVEZWNvZGVyQ29uZmlnO1xuICAgIHByaXZhdGUgX2lucHV0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI8VWludDhBcnJheT47XG4gICAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBwcml2YXRlIF9wYXR0ZXJuQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBwcml2YXRlIF9vdmVybGF5Q29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHByaXZhdGUgX2JhcmNvZGVSZWFkZXJzOiBBcnJheTxCYXJjb2RlUmVhZGVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogQmFyY29kZURlY29kZXJDb25maWcsIGlucHV0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI8VWludDhBcnJheT4pIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLl9pbnB1dEltYWdlV3JhcHBlciA9IGlucHV0SW1hZ2VXcmFwcGVyO1xuICAgICAgICB0aGlzLl9iYXJjb2RlUmVhZGVycyA9IFtdO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWJ1Z0RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWJ1Zy5kZXRlY3Rpb24nKTtcblxuICAgICAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzLmZyZXF1ZW5jeScpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mcmVxdWVuY3lDYW52YXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmVxdWVuY3lDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmVxdWVuY3lDYW52YXMuY2xhc3NOYW1lID0gJ2ZyZXF1ZW5jeSc7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRGl2KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnRGl2LmFwcGVuZENoaWxkKHRoaXMuX2ZyZXF1ZW5jeUNhbnZhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9jb25maWcuZGVidWcuc2hvd0ZyZXF1ZW5jeSA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgICAgIHRoaXMuX3BhdHRlcm5DYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMucGF0dGVybkJ1ZmZlcicpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wYXR0ZXJuQ2FudmFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGF0dGVybkNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhdHRlcm5DYW52YXMuY2xhc3NOYW1lID0gJ3BhdHRlcm5CdWZmZXInO1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0Rpdikge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Rpdi5hcHBlbmRDaGlsZCh0aGlzLl9wYXR0ZXJuQ2FudmFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wYXR0ZXJuQ2FudmFzLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9jb25maWcuZGVidWcuc2hvd1BhdHRlcm4gPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBvdmVybGF5Q2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oJ2NhbnZhcy5kcmF3aW5nQnVmZmVyJyk7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5Q29udGV4dCA9IG92ZXJsYXlDYW52YXMgPyBvdmVybGF5Q2FudmFzLmdldENvbnRleHQoJzJkJykgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdFJlYWRlcnMoKTtcbiAgICB9XG5cbiAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3hlcyhib3hlczogQXJyYXk8Qm94Pik6IFF1YWdnYUJhcmNvZGUge1xuICAgICAgICBsZXQgYmFyY29kZTogUXVhZ2dhQmFyY29kZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGJveGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyY29kZXMgPSBib3hlcy5tYXAoYm94ID0+IHRoaXMuZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGJhcmNvZGVzLCBib3hlcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveGVzLnNvbWUoYm94ID0+ICEhKGJhcmNvZGUgPSB0aGlzLmRlY29kZUZyb21Cb3VuZGluZ0JveChib3gpKSkpIHtcbiAgICAgICAgICAgICAgICBiYXJjb2RlLmJveGVzID0gYm94ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFyY29kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBjb25maWd1cmVkIHJlYWRlcnMgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBkZXRlY3RcbiAgICAgKiBhIHZhbGlkIGJhcmNvZGUgcGF0dGVybiB3aXRoaW4gdGhlIGdpdmVuIGFyZWEuXG4gICAgICogQHBhcmFtIGJveCBUaGUgYXJlYSB0byBzZWFyY2ggaW5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IHtjb2RlUmVzdWx0LCBsaW5lLCBhbmdsZSwgcGF0dGVybiwgdGhyZXNob2xkfVxuICAgICAqL1xuICAgIGRlY29kZUZyb21Cb3VuZGluZ0JveChib3g6IEJveCk6IFF1YWdnYUJhcmNvZGUge1xuICAgICAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5fb3ZlcmxheUNvbnRleHQgJiYgdGhpcy5fY29uZmlnLmRlYnVnO1xuXG4gICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5kcmF3Qm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdQYXRoKGJveCwgJ2JsdWUnLCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5fZ2V0TGluZShib3gpO1xuXG4gICAgICAgIGlmIChsaW5lID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihsaW5lWzFdLnkgLSBsaW5lWzBdLnksIGxpbmVbMV0ueCAtIGxpbmVbMF0ueCk7XG4gICAgICAgIGxpbmUgPSB0aGlzLl9nZXRFeHRlbmRlZExpbmUobGluZSwgYW5nbGUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90cnlEZWNvZGUobGluZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX3RyeURlY29kZUJydXRlRm9yY2UoYm94LCBsaW5lLCBhbmdsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5kcmF3U2NhbmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdQYXRoKGxpbmUsICdyZWQnLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbmdsZSxcbiAgICAgICAgICAgIGJveCxcbiAgICAgICAgICAgIGNvZGVSZXN1bHQ6IHJlc3VsdC5jb2RlUmVzdWx0LFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHBhdHRlcm46IHJlc3VsdC5iYXJjb2RlTGluZS5saW5lLFxuICAgICAgICAgICAgdGhyZXNob2xkOiByZXN1bHQuYmFyY29kZUxpbmUudGhyZXNob2xkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0UmVhZGVycyhyZWFkZXJzOiBBcnJheTxCYXJjb2RlUmVhZGVyRGVjbGFyYXRpb24+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5yZWFkZXJzID0gcmVhZGVycztcbiAgICAgICAgdGhpcy5fYmFyY29kZVJlYWRlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faW5pdFJlYWRlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0UmVhZGVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLnJlYWRlcnMuZm9yRWFjaChyZWFkZXJDb25maWcgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWRlcjogQmFyY29kZVJlYWRlclR5cGU7XG4gICAgICAgICAgICBsZXQgY29uZmlndXJhdGlvbjogQmFyY29kZVJlYWRlckNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgbGV0IHN1cHBsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNvbmZpZy5mb3JtYXQ7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IHJlYWRlckNvbmZpZy5jb25maWcgfHwge307XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWFkZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyQ29uZmlnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdCZWZvcmUgcmVnaXN0ZXJpbmcgcmVhZGVyOicsIHJlYWRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLnN1cHBsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgc3VwcGxlbWVudHMgPSBjb25maWd1cmF0aW9uLnN1cHBsZW1lbnRzLm1hcChzdXBwbGVtZW50ID0+IG5ldyBSZWFkZXJzW3N1cHBsZW1lbnRdKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9iYXJjb2RlUmVhZGVycy5wdXNoKG5ldyBSZWFkZXJzW3JlYWRlcl0oY29uZmlndXJhdGlvbiwgc3VwcGxlbWVudHMpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZWdpc3RlcmVkIFJlYWRlcnM6JyxcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9iYXJjb2RlUmVhZGVycy5tYXAoKHsgY29uZmlnLCBGT1JNQVQgfSkgPT4gSlNPTi5zdHJpbmdpZnkoeyBjb25maWcsIEZPUk1BVCB9KSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXh0ZW5kIHRoZSBsaW5lIG9uIGJvdGggZW5kc1xuICAgICAqIEBwYXJhbSBsaW5lXG4gICAgICogQHBhcmFtIGFuZ2xlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RXh0ZW5kZWRMaW5lKGxpbmU6IExpbmUsIGFuZ2xlOiBudW1iZXIpOiBMaW5lIHtcbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kTGluZShhbW91bnQ6IG51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IGFtb3VudCAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICB4OiBhbW91bnQgKiBNYXRoLmNvcyhhbmdsZSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxpbmVbMF0ueSAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgIGxpbmVbMF0ueCAtPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgIGxpbmVbMV0ueSArPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgIGxpbmVbMV0ueCArPSBleHRlbnNpb24ueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBNYXRoLnNxcnQoKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSkgKiogMiArIChsaW5lWzFdLnggLSBsaW5lWzBdLngpICoqIDIpO1xuICAgICAgICBsZXQgZXh0ZW5zaW9uTGVuZ3RoID0gbGluZUxlbmd0aCAqIDAuMSB8IDA7XG5cbiAgICAgICAgZXh0ZW5kTGluZShleHRlbnNpb25MZW5ndGgpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGluc2lkZSBpbWFnZVxuICAgICAgICB3aGlsZSAoZXh0ZW5zaW9uTGVuZ3RoID4gMSAmJiAoIXRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyLmluSW1hZ2VXaXRoQm9yZGVyKGxpbmVbMF0sIDApXG4gICAgICAgICAgICB8fCAhdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIuaW5JbWFnZVdpdGhCb3JkZXIobGluZVsxXSwgMCkpKSB7XG4gICAgICAgICAgICBleHRlbnNpb25MZW5ndGggPj49IDE7XG4gICAgICAgICAgICBleHRlbmRMaW5lKC1leHRlbnNpb25MZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0TGluZShib3g6IEJveCk6IExpbmUge1xuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgIHg6IChib3hbMV0ueCArIGJveFswXS54KSAvIDIsXG4gICAgICAgICAgICB5OiAoYm94WzFdLnkgKyBib3hbMF0ueSkgLyAyXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IChib3hbM10ueCArIGJveFsyXS54KSAvIDIsXG4gICAgICAgICAgICB5OiAoYm94WzNdLnkgKyBib3hbMl0ueSkgLyAyXG4gICAgICAgIH1dO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RyeURlY29kZShsaW5lOiBMaW5lKTogQmFyY29kZUFuZEJhcmNvZGVMaW5lIHtcbiAgICAgICAgY29uc3QgZGVidWcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZztcblxuICAgICAgICBpZiAoZGVidWcgJiYgdGhpcy5fb3ZlcmxheUNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdQYXRoKGxpbmUsICdyZWQnLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiYXJjb2RlTGluZSA9IEJyZXNlbmhhbS5nZXRCYXJjb2RlTGluZSh0aGlzLl9pbnB1dEltYWdlV3JhcHBlciwgbGluZVswXSwgbGluZVsxXSk7XG5cbiAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dGcmVxdWVuY3kpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByaW50RnJlcXVlbmN5KGJhcmNvZGVMaW5lLmxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmFyY29kZUxpbmUgPSBCcmVzZW5oYW0udG9CaW5hcnlMaW5lKGJhcmNvZGVMaW5lKTtcblxuICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuc2hvd1BhdHRlcm4pIHtcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGF0dGVybihiYXJjb2RlTGluZS5saW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlUmVzdWx0OiBCYXJjb2RlID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9iYXJjb2RlUmVhZGVycy5zb21lKHJlYWRlciA9PiAhIShjb2RlUmVzdWx0ID0gcmVhZGVyLmRlY29kZVBhdHRlcm4oYmFyY29kZUxpbmUubGluZSkpKTtcblxuICAgICAgICByZXR1cm4gY29kZVJlc3VsdCA/IHsgY29kZVJlc3VsdCwgYmFyY29kZUxpbmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2xpY2VzIHRoZSBnaXZlbiBhcmVhIGFwYXJ0IGFuZCB0cmllcyB0byBkZXRlY3QgYSBiYXJjb2RlLXBhdHRlcm4gZm9yIGVhY2ggc2xpY2UuXG4gICAgICogSXQgcmV0dXJucyB0aGUgZGVjb2RlZCBiYXJjb2RlLCBvciBudWxsIGlmIG5vdGhpbmcgd2FzIGZvdW5kXG4gICAgICogQHBhcmFtIGJveFxuICAgICAqIEBwYXJhbSBsaW5lXG4gICAgICogQHBhcmFtIGxpbmVBbmdsZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3RyeURlY29kZUJydXRlRm9yY2UoYm94OiBCb3gsIGxpbmU6IExpbmUsIGxpbmVBbmdsZTogbnVtYmVyKTogQmFyY29kZUFuZEJhcmNvZGVMaW5lIHtcbiAgICAgICAgY29uc3Qgc2lkZUxlbmd0aCA9IE1hdGguc3FydCgoYm94WzFdLnggLSBib3hbMF0ueCkgKiogMiArIChib3hbMV0ueSAtIGJveFswXS55KSAqKiAyKTtcbiAgICAgICAgY29uc3Qgc2xpY2VzID0gMTY7XG4gICAgICAgIGNvbnN0IHhkaXIgPSBNYXRoLnNpbihsaW5lQW5nbGUpO1xuICAgICAgICBjb25zdCB5ZGlyID0gTWF0aC5jb3MobGluZUFuZ2xlKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNsaWNlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtb3ZlIGxpbmUgcGVycGVuZGljdWxhciB0byBhbmdsZVxuICAgICAgICAgICAgY29uc3QgZGlyID0gc2lkZUxlbmd0aCAvIHNsaWNlcyAqIGkgKiAoaSAlIDIgPT09IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgbGluZVswXS55ICs9IGRpciAqIHhkaXI7XG4gICAgICAgICAgICBsaW5lWzBdLnggLT0gZGlyICogeWRpcjtcbiAgICAgICAgICAgIGxpbmVbMV0ueSArPSBkaXIgKiB4ZGlyO1xuICAgICAgICAgICAgbGluZVsxXS54IC09IGRpciAqIHlkaXI7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3RyeURlY29kZShsaW5lKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZGV2ZWxvcG1lbnQgb25seVxuICAgICAqL1xuICAgIHByaXZhdGUgX3ByaW50RnJlcXVlbmN5KGxpbmU6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2ZyZXF1ZW5jeUNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB0aGlzLl9mcmVxdWVuY3lDYW52YXMud2lkdGggPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzLmhlaWdodCA9IDI1NjtcblxuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8oaSwgMjU1KTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKGksIDI1NSAtIGxpbmVbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBkZXZlbG9wbWVudCBvbmx5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfcHJpbnRQYXR0ZXJuKGxpbmU6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3BhdHRlcm5DYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICB0aGlzLl9wYXR0ZXJuQ2FudmFzLndpZHRoID0gbGluZS5sZW5ndGg7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ2JsYWNrJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsUmVjdChpLCAwLCAxLCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhd1BhdGgocGF0aDogQXJyYXk8UG9pbnQ+LCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKHBhdGgsIHRoaXMuX292ZXJsYXlDb250ZXh0LCBjb2xvciwgbGluZVdpZHRoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2NvbW1vbi9wb2ludCc7XG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICcuLi9jb21tb24vaW1hZ2Utd3JhcHBlcic7XG5cbmVudW0gU2xvcGUge1xuICAgIFVwID0gMSxcbiAgICBEb3duID0gLTFcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZUxpbmUge1xuICAgIGxpbmU6IEFycmF5PG51bWJlcj47XG4gICAgbWF4PzogbnVtYmVyO1xuICAgIG1pbj86IG51bWJlcjtcbiAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBCcmVzZW5oYW0gPSB7XG4gICAgLyoqXG4gICAgICogU2NhbnMgYSBsaW5lIG9mIHRoZSBnaXZlbiBpbWFnZSBmcm9tIHBvaW50IHAxIHRvIHAyIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBjb250YWluaW5nXG4gICAgICogZ3JheS1zY2FsZSB2YWx1ZXMgKDAtMjU1KSBvZiB0aGUgdW5kZXJseWluZyBwaXhlbHMgaW4gYWRkaXRpb24gdG8gdGhlIG1pbiBhbmQgbWF4IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gaW1hZ2VXcmFwcGVyXG4gICAgICogQHBhcmFtIHAxIFRoZSBzdGFydCBwb2ludCB7eCx5fVxuICAgICAqIEBwYXJhbSBwMiBUaGUgZW5kIHBvaW50IHt4LHl9XG4gICAgICogQHJldHVybnMge2xpbmUsIG1pbiwgbWF4fVxuICAgICAqL1xuICAgIGdldEJhcmNvZGVMaW5lKGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyLCBwMTogUG9pbnQsIHAyOiBQb2ludCk6IEJhcmNvZGVMaW5lIHtcbiAgICAgICAgbGV0IHgwID0gcDEueCB8IDA7XG4gICAgICAgIGxldCB5MCA9IHAxLnkgfCAwO1xuICAgICAgICBsZXQgeDEgPSBwMi54IHwgMDtcbiAgICAgICAgbGV0IHkxID0gcDIueSB8IDA7XG4gICAgICAgIGNvbnN0IHN0ZWVwID0gTWF0aC5hYnMoeTEgLSB5MCkgPiBNYXRoLmFicyh4MSAtIHgwKTtcbiAgICAgICAgbGV0IHRtcDogbnVtYmVyO1xuICAgICAgICBjb25zdCBsaW5lID0gW107XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIGxldCB2YWw6IG51bWJlcjtcbiAgICAgICAgbGV0IG1pbiA9IDI1NTtcbiAgICAgICAgbGV0IG1heCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZChhOiBudW1iZXIsIGI6IG51bWJlcikge1xuICAgICAgICAgICAgdmFsID0gaW1hZ2VEYXRhW2IgKiB3aWR0aCArIGFdO1xuICAgICAgICAgICAgbWluID0gdmFsIDwgbWluID8gdmFsIDogbWluO1xuICAgICAgICAgICAgbWF4ID0gdmFsID4gbWF4ID8gdmFsIDogbWF4O1xuICAgICAgICAgICAgbGluZS5wdXNoKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RlZXApIHtcbiAgICAgICAgICAgIHRtcCA9IHgwO1xuICAgICAgICAgICAgeDAgPSB5MDtcbiAgICAgICAgICAgIHkwID0gdG1wO1xuXG4gICAgICAgICAgICB0bXAgPSB4MTtcbiAgICAgICAgICAgIHgxID0geTE7XG4gICAgICAgICAgICB5MSA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeDAgPiB4MSkge1xuICAgICAgICAgICAgdG1wID0geDA7XG4gICAgICAgICAgICB4MCA9IHgxO1xuICAgICAgICAgICAgeDEgPSB0bXA7XG5cbiAgICAgICAgICAgIHRtcCA9IHkwO1xuICAgICAgICAgICAgeTAgPSB5MTtcbiAgICAgICAgICAgIHkxID0gdG1wO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlbHRheCA9IHgxIC0geDA7XG4gICAgICAgIGxldCBkZWx0YXkgPSBNYXRoLmFicyh5MSAtIHkwKTtcbiAgICAgICAgbGV0IGVycm9yID0gKGRlbHRheCAvIDIpIHwgMDtcbiAgICAgICAgbGV0IHkgPSB5MDtcbiAgICAgICAgbGV0IHlzdGVwID0geTAgPCB5MSA/IDEgOiAtMTtcblxuICAgICAgICBmb3IgKGxldCB4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICBpZiAoc3RlZXApIHtcbiAgICAgICAgICAgICAgICByZWFkKHksIHgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWFkKHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXJyb3IgPSBlcnJvciAtIGRlbHRheTtcbiAgICAgICAgICAgIGlmIChlcnJvciA8IDApIHtcbiAgICAgICAgICAgICAgICB5ICs9IHlzdGVwO1xuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyb3IgKyBkZWx0YXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIG1pbixcbiAgICAgICAgICAgIG1heFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgcmVzdWx0IGZyb20gZ2V0QmFyY29kZUxpbmUgaW50byBhIGJpbmFyeSByZXByZXNlbnRhdGlvblxuICAgICAqIGFsc28gY29uc2lkZXJpbmcgdGhlIGZyZXF1ZW5jeSBhbmQgc2xvcGUgb2YgdGhlIHNpZ25hbCBmb3IgbW9yZSByb2J1c3QgcmVzdWx0c1xuICAgICAqIEBwYXJhbSByZXN1bHQge2xpbmUsIG1pbiwgbWF4fVxuICAgICAqL1xuICAgIHRvQmluYXJ5TGluZShyZXN1bHQ6IEJhcmNvZGVMaW5lKTogQmFyY29kZUxpbmUge1xuICAgICAgICBjb25zdCBtaW4gPSByZXN1bHQubWluO1xuICAgICAgICBjb25zdCBtYXggPSByZXN1bHQubWF4O1xuICAgICAgICBjb25zdCBsaW5lID0gcmVzdWx0LmxpbmU7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IG1pbiArIChtYXggLSBtaW4pIC8gMjtcbiAgICAgICAgY29uc3QgZXh0cmVtYSA9IG5ldyBBcnJheTx7IHBvczogbnVtYmVyOyB2YWw6IG51bWJlcjsgfT4oKTtcbiAgICAgICAgbGV0IHRocmVzaG9sZCA9IChtYXggLSBtaW4pIC8gMTI7XG4gICAgICAgIGNvbnN0IHJUaHJlc2hvbGQgPSAtdGhyZXNob2xkO1xuXG4gICAgICAgIC8vIDEuIGZpbmQgZXh0cmVtYVxuICAgICAgICBsZXQgY3VycmVudERpciA9IGxpbmVbMF0gPiBjZW50ZXIgPyBTbG9wZS5VcCA6IFNsb3BlLkRvd247XG4gICAgICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgICAgICBwb3M6IDAsXG4gICAgICAgICAgICB2YWw6IGxpbmVbMF1cbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3BlID0gKGxpbmVbaSArIDFdIC0gbGluZVtpXSk7XG4gICAgICAgICAgICBjb25zdCBzbG9wZTIgPSAobGluZVtpICsgMl0gLSBsaW5lW2kgKyAxXSk7XG4gICAgICAgICAgICBsZXQgZGlyOiBTbG9wZTtcbiAgICAgICAgICAgIGlmICgoc2xvcGUgKyBzbG9wZTIpIDwgclRocmVzaG9sZCAmJiBsaW5lW2kgKyAxXSA8IChjZW50ZXIgKiAxLjUpKSB7XG4gICAgICAgICAgICAgICAgZGlyID0gU2xvcGUuRG93bjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNsb3BlICsgc2xvcGUyKSA+IHRocmVzaG9sZCAmJiBsaW5lW2kgKyAxXSA+IChjZW50ZXIgKiAwLjUpKSB7XG4gICAgICAgICAgICAgICAgZGlyID0gU2xvcGUuVXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpciA9IGN1cnJlbnREaXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RGlyICE9PSBkaXIpIHtcbiAgICAgICAgICAgICAgICBleHRyZW1hLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBwb3M6IGksXG4gICAgICAgICAgICAgICAgICAgIHZhbDogbGluZVtpXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREaXIgPSBkaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgICAgIHBvczogbGluZS5sZW5ndGgsXG4gICAgICAgICAgICB2YWw6IGxpbmVbbGluZS5sZW5ndGggLSAxXVxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGxldCBqID0gZXh0cmVtYVswXS5wb3M7IGogPCBleHRyZW1hWzFdLnBvczsgaisrKSB7XG4gICAgICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IGNlbnRlciA/IDAgOiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGV4dHJlbWEgYW5kIGNvbnZlcnQgdG8gYmluYXJ5IGJhc2VkIG9uIGF2ZyBiZXR3ZWVuIG1pbm1heFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGV4dHJlbWEubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmVtYVtpICsgMV0udmFsID4gZXh0cmVtYVtpXS52YWwpIHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSAoZXh0cmVtYVtpXS52YWwgKyAoKGV4dHJlbWFbaSArIDFdLnZhbCAtIGV4dHJlbWFbaV0udmFsKSAvIDMpICogMikgfCAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSAoZXh0cmVtYVtpICsgMV0udmFsICsgKChleHRyZW1hW2ldLnZhbCAtIGV4dHJlbWFbaSArIDFdLnZhbCkgLyAzKSkgfCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gZXh0cmVtYVtpXS5wb3M7IGogPCBleHRyZW1hW2kgKyAxXS5wb3M7IGorKykge1xuICAgICAgICAgICAgICAgIGxpbmVbal0gPSBsaW5lW2pdID4gdGhyZXNob2xkID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgdGhyZXNob2xkXG4gICAgICAgIH07XG4gICAgfVxufTtcbiIsImltcG9ydCB7IGdldFVzZXJNZWRpYSwgZW51bWVyYXRlRGV2aWNlcyB9IGZyb20gJy4uL2NvbW1vbi9tZWRpYS1kZXZpY2VzJztcblxubGV0IF9zdHJlYW06IE1lZGlhU3RyZWFtO1xuXG5leHBvcnQgY29uc3QgQ2FtZXJhQWNjZXNzID0ge1xuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGF0dGFjaCB0aGUgY2FtZXJhLXN0cmVhbSB0byBhIGdpdmVuIHZpZGVvIGVsZW1lbnRcbiAgICAgKiBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIGNvbnRlbnQgaXMgcmVhZHlcbiAgICAgKiBAcGFyYW0gdmlkZW9cbiAgICAgKiBAcGFyYW0gdmlkZW9Db25zdHJhaW50c1xuICAgICAqL1xuICAgIGFzeW5jIHJlcXVlc3QodmlkZW86IEhUTUxWaWRlb0VsZW1lbnQsIHZpZGVvQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ29uc3RyYWludHMgPSBDYW1lcmFBY2Nlc3MucGlja0NvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpO1xuICAgICAgICBfc3RyZWFtID0gYXdhaXQgZ2V0VXNlck1lZGlhKG5vcm1hbGl6ZWRDb25zdHJhaW50cyk7XG4gICAgICAgIHZpZGVvLnNyY09iamVjdCA9IF9zdHJlYW07XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCAnJyk7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnbXV0ZWQnLCAnJyk7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pKS50aGVuKF93YWl0Rm9yVmlkZW8uYmluZChudWxsLCB2aWRlbykpO1xuICAgIH0sXG5cbiAgICByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFja3MgPSBfc3RyZWFtICYmIF9zdHJlYW0uZ2V0VmlkZW9UcmFja3MoKTtcbiAgICAgICAgaWYgKHRyYWNrcyAmJiB0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0cmFja3NbMF0uc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIF9zdHJlYW0gPSBudWxsO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnVtZXJhdGVWaWRlb0RldmljZXMoKTogUHJvbWlzZTxBcnJheTxNZWRpYURldmljZUluZm8+PiB7XG4gICAgICAgIGNvbnN0IGRldmljZXMgPSBhd2FpdCBlbnVtZXJhdGVEZXZpY2VzKCk7XG4gICAgICAgIHJldHVybiBkZXZpY2VzLmZpbHRlcigoeyBraW5kIH0pID0+IGtpbmQgPT09ICd2aWRlb2lucHV0Jyk7XG4gICAgfSxcblxuICAgIGdldEFjdGl2ZVN0cmVhbUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gQ2FtZXJhQWNjZXNzLmdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIHJldHVybiB0cmFjayA/IHRyYWNrLmxhYmVsIDogJyc7XG4gICAgfSxcblxuICAgIGdldEFjdGl2ZVRyYWNrKCkge1xuICAgICAgICBjb25zdCB0cmFja3MgPSBfc3RyZWFtICYmIF9zdHJlYW0uZ2V0VmlkZW9UcmFja3MoKTtcbiAgICAgICAgaWYgKHRyYWNrcyAmJiB0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2tzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIHBpY2tDb25zdHJhaW50cyh2aWRlb0NvbnN0cmFpbnRzOiBNZWRpYVRyYWNrQ29uc3RyYWludHMpOiBNZWRpYVN0cmVhbUNvbnN0cmFpbnRzIHtcbiAgICAgICAgbGV0IHsgd2lkdGgsIGhlaWdodCwgZmFjaW5nTW9kZSwgYXNwZWN0UmF0aW8sIGRldmljZUlkIH0gPSB2aWRlb0NvbnN0cmFpbnRzO1xuICAgICAgICBjb25zdCB7IG1pbkFzcGVjdFJhdGlvLCBmYWNpbmcgfSA9IHZpZGVvQ29uc3RyYWludHMgYXMgYW55O1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWluQXNwZWN0UmF0aW8gIT09ICd1bmRlZmluZWQnICYmIG1pbkFzcGVjdFJhdGlvID4gMCkge1xuICAgICAgICAgICAgYXNwZWN0UmF0aW8gPSBtaW5Bc3BlY3RSYXRpbztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXQVJOSU5HOiBDb25zdHJhaW50ICdtaW5Bc3BlY3RSYXRpbycgaXMgZGVwcmVjYXRlZDsgVXNlICdhc3BlY3RSYXRpbycgaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWNpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmYWNpbmdNb2RlID0gZmFjaW5nO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFdBUk5JTkc6IENvbnN0cmFpbnQgJ2ZhY2luZycgaXMgZGVwcmVjYXRlZC4gVXNlICdmYWNpbmdNb2RlJyBpbnN0ZWFkJ2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZENvbnN0cmFpbnRzID0gZGV2aWNlSWQgJiYgZmFjaW5nTW9kZSA/XG4gICAgICAgICAgICB7IHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvLCBkZXZpY2VJZCB9IDogeyB3aWR0aCwgaGVpZ2h0LCBmYWNpbmdNb2RlLCBhc3BlY3RSYXRpbywgZGV2aWNlSWQgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICAgICAgdmlkZW86IG5vcm1hbGl6ZWRDb25zdHJhaW50c1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX3dhaXRGb3JWaWRlbyh7IHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgYXR0ZW1wdHMgPSAxMDtcblxuICAgICAgICBmdW5jdGlvbiBjaGVja1ZpZGVvKCkge1xuICAgICAgICAgICAgaWYgKGF0dGVtcHRzID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoID4gMTAgJiYgdmlkZW9IZWlnaHQgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dmlkZW9XaWR0aH1weCB4ICR7dmlkZW9IZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2hlY2tWaWRlbywgNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdCgnVW5hYmxlIHRvIHBsYXkgdmlkZW8gc3RyZWFtLiBJcyB3ZWJjYW0gd29ya2luZz8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dGVtcHRzLS07XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tWaWRlbygpO1xuICAgIH0pO1xufVxuIiwiLyoqXG4gKiBAYm9ycm93cyBodHRwczovL2dpdGh1Yi5jb20vZXhpZi1qcy9leGlmLWpzXG4gKi9cblxuY29uc3QgRXhpZlRhZ3MgPSB7IDB4MDExMjogJ29yaWVudGF0aW9uJyB9O1xuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZVRhZ3M6IEFycmF5PHN0cmluZz4gPSBPYmplY3Qua2V5cyhFeGlmVGFncykubWFwKGtleSA9PiBFeGlmVGFnc1trZXldKTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWdzIHtcbiAgICBba2V5OiBzdHJpbmddOiBudW1iZXIgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kVGFnc0luT2JqZWN0VVJMKHNyYzogc3RyaW5nLCB0YWdzID0gQXZhaWxhYmxlVGFncyk6IFByb21pc2U8VGFncz4ge1xuICAgIGlmICgvXmJsb2I6L2kudGVzdChzcmMpKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IG9iamVjdFVSTFRvQmxvYihzcmMpO1xuICAgICAgICByZXR1cm4gZmluZFRhZ3NJbkJ1ZmZlcihidWZmZXIsIHRhZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ3NJbkJ1ZmZlcihmaWxlOiBBcnJheUJ1ZmZlciwgc2VsZWN0ZWRUYWdzOiBBcnJheTxzdHJpbmc+ID0gQXZhaWxhYmxlVGFncyk6IFRhZ3Mge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGZpbGUpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGZpbGUuYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBleGlmVGFncyA9IHNlbGVjdGVkVGFncy5yZWR1Y2UoKHJlc3VsdCwgc2VsZWN0ZWRUYWcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpZlRhZyA9IE9iamVjdC5rZXlzKEV4aWZUYWdzKS5maW5kKHRhZyA9PiBFeGlmVGFnc1t0YWddID09PSBzZWxlY3RlZFRhZyk7XG4gICAgICAgIGlmIChleGlmVGFnKSB7XG4gICAgICAgICAgICByZXN1bHRbZXhpZlRhZ10gPSBzZWxlY3RlZFRhZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgICBsZXQgb2Zmc2V0ID0gMjtcblxuICAgIGlmICgoZGF0YVZpZXcuZ2V0VWludDgoMCkgIT09IDB4RkYpIHx8IChkYXRhVmlldy5nZXRVaW50OCgxKSAhPT0gMHhEOCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0KSAhPT0gMHhGRikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXJrZXIgPSBkYXRhVmlldy5nZXRVaW50OChvZmZzZXQgKyAxKTtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhFMSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRFWElGRGF0YShkYXRhVmlldywgb2Zmc2V0ICsgNCwgZXhpZlRhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDIgKyBkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gb2JqZWN0VVJMVG9CbG9iKHVybDogc3RyaW5nKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdIVFRQIEVycm9yICcgKyByZXNwb25zZS5zdGF0dXMpO1xufVxuXG5mdW5jdGlvbiByZWFkRVhJRkRhdGEoZGF0YVZpZXc6IERhdGFWaWV3LCBzdGFydDogbnVtYmVyLCBleGlmVGFnczogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSk6IFRhZ3Mge1xuICAgIGlmICgnRXhpZicuc3BsaXQoJycpLnNvbWUoKGNoYXIsIGluZGV4KSA9PiBkYXRhVmlldy5nZXRVaW50OChzdGFydCArIGluZGV4KSAhPT0gY2hhci5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB0aWZmT2Zmc2V0ID0gc3RhcnQgKyA2O1xuICAgIGxldCBiaWdFbmQ6IGJvb2xlYW47XG5cbiAgICBpZiAoZGF0YVZpZXcuZ2V0VWludDE2KHRpZmZPZmZzZXQpID09PSAweDQ5NDkpIHtcbiAgICAgICAgYmlnRW5kID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChkYXRhVmlldy5nZXRVaW50MTYodGlmZk9mZnNldCkgPT09IDB4NEQ0RCkge1xuICAgICAgICBiaWdFbmQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkYXRhVmlldy5nZXRVaW50MTYodGlmZk9mZnNldCArIDIsICFiaWdFbmQpICE9PSAweDAwMkEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RJRkRPZmZzZXQgPSBkYXRhVmlldy5nZXRVaW50MzIodGlmZk9mZnNldCArIDQsICFiaWdFbmQpO1xuICAgIGlmIChmaXJzdElGRE9mZnNldCA8IDB4MDAwMDAwMDgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdGFncyA9IHJlYWRUYWdzKGRhdGFWaWV3LCB0aWZmT2Zmc2V0ICsgZmlyc3RJRkRPZmZzZXQsIGV4aWZUYWdzLCBiaWdFbmQpO1xuICAgIHJldHVybiB0YWdzO1xufVxuXG5mdW5jdGlvbiByZWFkVGFncyhkYXRhVmlldzogRGF0YVZpZXcsIGRpclN0YXJ0OiBudW1iZXIsIHN0cmluZ3M6IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0sIGJpZ0VuZDogYm9vbGVhbik6IFRhZ3Mge1xuICAgIGNvbnN0IGVudHJpZXMgPSBkYXRhVmlldy5nZXRVaW50MTYoZGlyU3RhcnQsICFiaWdFbmQpO1xuICAgIGNvbnN0IHRhZ3M6IFRhZ3MgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5T2Zmc2V0ID0gZGlyU3RhcnQgKyBpICogMTIgKyAyO1xuICAgICAgICBjb25zdCB0YWcgPSBzdHJpbmdzW2RhdGFWaWV3LmdldFVpbnQxNihlbnRyeU9mZnNldCwgIWJpZ0VuZCldO1xuICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICB0YWdzW3RhZ10gPSByZWFkVGFnVmFsdWUoZGF0YVZpZXcsIGVudHJ5T2Zmc2V0LCBiaWdFbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdWYWx1ZShkYXRhVmlldzogRGF0YVZpZXcsIGVudHJ5T2Zmc2V0OiBudW1iZXIsIGJpZ0VuZDogYm9vbGVhbik6IG51bWJlciB8IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGFWaWV3LmdldFVpbnQxNihlbnRyeU9mZnNldCArIDIsICFiaWdFbmQpO1xuICAgIGNvbnN0IG51bVZhbHVlcyA9IGRhdGFWaWV3LmdldFVpbnQzMihlbnRyeU9mZnNldCArIDQsICFiaWdFbmQpO1xuXG4gICAgcmV0dXJuIHR5cGUgPT09IDMgJiYgbnVtVmFsdWVzID09PSAxID8gZGF0YVZpZXcuZ2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgOCwgIWJpZ0VuZCkgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2NvbW1vbi9wb2ludCc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbSB9IGZyb20gJy4vaW5wdXQtc3RyZWFtJztcbmltcG9ydCB7IElucHV0U3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0tY29uZmlnJztcblxuY29uc3QgUVVBVEVSX0NJUkNMRSA9IE1hdGguUEkgLyAyO1xuXG5leHBvcnQgY2xhc3MgRnJhbWVHcmFiYmVyIHtcbiAgICBwcml2YXRlIF9pbnB1dFN0cmVhbTogSW5wdXRTdHJlYW07XG4gICAgcHJpdmF0ZSBfc3RyZWFtQ29uZmlnOiBJbnB1dFN0cmVhbUNvbmZpZztcbiAgICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIHByaXZhdGUgX2NvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICBwcml2YXRlIF9kYXRhOiBVaW50OEFycmF5O1xuICAgIHByaXZhdGUgX2NhbnZhc0hlaWdodDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2NhbnZhc1dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIF90b3BMZWZ0OiBQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSwgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtO1xuICAgICAgICB0aGlzLl9zdHJlYW1Db25maWcgPSBpbnB1dFN0cmVhbS5jb25maWc7XG4gICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gaW5wdXRTdHJlYW0uY2FudmFzV2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IGlucHV0U3RyZWFtLmNhbnZhc0hlaWdodDtcbiAgICAgICAgdGhpcy5fd2lkdGggPSBpbnB1dFN0cmVhbS53aWR0aDtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaW5wdXRTdHJlYW0uaGVpZ2h0O1xuICAgICAgICB0aGlzLl90b3BMZWZ0ID0gaW5wdXRTdHJlYW0udG9wTGVmdDtcbiAgICAgICAgdGhpcy5fY2FudmFzID0gY2FudmFzIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSB0aGlzLl9jYW52YXNXaWR0aDtcbiAgICAgICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuX2NhbnZhc0hlaWdodDtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fd2lkdGggKiB0aGlzLl9oZWlnaHQpO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRnJhbWVHcmFiYmVyJywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHNpemU6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogdGhpcy5fd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHk6IHRoaXMuX2hlaWdodFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9wTGVmdDogdGhpcy5fdG9wTGVmdCxcbiAgICAgICAgICAgICAgICB2aWRlb1NpemU6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogaW5wdXRTdHJlYW0ucmVhbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICB5OiBpbnB1dFN0cmVhbS5yZWFsSGVpZ2h0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjYW52YXNTaXplOiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHRoaXMuX2NhbnZhc1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICB5OiB0aGlzLl9jYW52YXNIZWlnaHRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGEgZnJhbWUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCBwdXRzIGludG8gdGhlIGZyYW1lIGJ1ZmZlci5cbiAgICAgKiBUaGUgaW1hZ2UgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gZ3JheSBzY2FsZSBhbmQgdGhlbiBoYWxmLXNhbXBsZWQgaWYgY29uZmlndXJlZC5cbiAgICAgKi9cbiAgICBncmFiKGRhdGE6IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5faW5wdXRTdHJlYW0uZ2V0RnJhbWUoKTtcblxuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkanVzdENhbnZhc1NpemUoKTtcblxuICAgICAgICAgICAgbGV0IGRyYXdhYmxlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBkcmF3QW5nbGUgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZnJhbWUgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZHJhd2FibGUgPSBmcmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHJhd2FibGUgPSBmcmFtZS5pbWFnZTtcblxuICAgICAgICAgICAgICAgIGlmIChmcmFtZS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZnJhbWUudGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0FuZ2xlID0gUVVBVEVSX0NJUkNMRTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdBbmdsZSA9IC1RVUFURVJfQ0lSQ0xFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZHJhd0FuZ2xlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFsZldpZHRoID0gdGhpcy5fY2FudmFzV2lkdGggPj4gMTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYWxmSGVpZ2h0ID0gdGhpcy5fY2FudmFzSGVpZ2h0ID4+IDE7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LnRyYW5zbGF0ZShoYWxmV2lkdGgsIGhhbGZIZWlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQucm90YXRlKGRyYXdBbmdsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC5kcmF3SW1hZ2UoZHJhd2FibGUsIC1oYWxmSGVpZ2h0LCAtaGFsZldpZHRoLCB0aGlzLl9jYW52YXNIZWlnaHQsIHRoaXMuX2NhbnZhc1dpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LnJvdGF0ZSgtZHJhd0FuZ2xlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LnRyYW5zbGF0ZSgtaGFsZldpZHRoLCAtaGFsZkhlaWdodCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuZHJhd0ltYWdlKGRyYXdhYmxlLCAwLCAwLCB0aGlzLl9jYW52YXNXaWR0aCwgdGhpcy5fY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5fY29udGV4dC5nZXRJbWFnZURhdGEodGhpcy5fdG9wTGVmdC54LCB0aGlzLl90b3BMZWZ0LnksIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpLmRhdGE7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdHJlYW1Db25maWcuaGFsZlNhbXBsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEoaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUdyYXkoaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGp1c3RDYW52YXNTaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY2FudmFzLmhlaWdodCAhPT0gdGhpcy5fY2FudmFzSGVpZ2h0IHx8IHRoaXMuX2NhbnZhcy53aWR0aCAhPT0gdGhpcy5fY2FudmFzV2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDYW52YXMgc2l6ZSBuZWVkcyB0byBiZSBhZGp1c3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuX2NhbnZhc0hlaWdodDtcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHRoaXMuX2NhbnZhc1dpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ3JheUFuZEhhbGZTYW1wbGVGcm9tQ2FudmFzRGF0YShpbWFnZURhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gaW1hZ2VEYXRhLmxlbmd0aCA+PiAyO1xuICAgICAgICBjb25zdCBvdXRXaWR0aCA9IHRoaXMuX3dpZHRoID4+IDE7XG4gICAgICAgIGxldCB0b3BSb3dJbmRleCA9IDA7XG4gICAgICAgIGxldCBib3R0b21Sb3dJbmRleCA9IHRoaXMuX3dpZHRoO1xuICAgICAgICBsZXQgb3V0SW1hZ2VJbmRleCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGJvdHRvbVJvd0luZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0V2lkdGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcDQgPSB0b3BSb3dJbmRleCA8PCAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbTQgPSBib3R0b21Sb3dJbmRleCA8PCAyO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFbb3V0SW1hZ2VJbmRleF0gPSAoXG4gICAgICAgICAgICAgICAgICAgICgwLjI5OSAqIGltYWdlRGF0YVt0b3A0ICsgMF0gKyAwLjU4NyAqIGltYWdlRGF0YVt0b3A0ICsgMV0gKyAwLjExNCAqIGltYWdlRGF0YVt0b3A0ICsgMl0pICtcbiAgICAgICAgICAgICAgICAgICAgKDAuMjk5ICogaW1hZ2VEYXRhW3RvcDQgKyA0XSArIDAuNTg3ICogaW1hZ2VEYXRhW3RvcDQgKyA1XSArIDAuMTE0ICogaW1hZ2VEYXRhW3RvcDQgKyA2XSkgK1xuICAgICAgICAgICAgICAgICAgICAoMC4yOTkgKiBpbWFnZURhdGFbYm90dG9tNCArIDBdICsgMC41ODcgKiBpbWFnZURhdGFbYm90dG9tNCArIDFdICsgMC4xMTQgKiBpbWFnZURhdGFbYm90dG9tNCArIDJdKSArXG4gICAgICAgICAgICAgICAgICAgICgwLjI5OSAqIGltYWdlRGF0YVtib3R0b200ICsgNF0gKyAwLjU4NyAqIGltYWdlRGF0YVtib3R0b200ICsgNV0gKyAwLjExNCAqIGltYWdlRGF0YVtib3R0b200ICsgNl0pXG4gICAgICAgICAgICAgICAgKSAvIDQgfCAwO1xuICAgICAgICAgICAgICAgIG91dEltYWdlSW5kZXgrKztcbiAgICAgICAgICAgICAgICB0b3BSb3dJbmRleCArPSAyO1xuICAgICAgICAgICAgICAgIGJvdHRvbVJvd0luZGV4ICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3BSb3dJbmRleCArPSB0aGlzLl93aWR0aDtcbiAgICAgICAgICAgIGJvdHRvbVJvd0luZGV4ICs9IHRoaXMuX3dpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29tcHV0ZUdyYXkoaW1hZ2VEYXRhOiBVaW50OENsYW1wZWRBcnJheSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZURhdGFMZW5ndGggPSBpbWFnZURhdGEubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0aGlzLl9zdHJlYW1Db25maWcgJiYgdGhpcy5fc3RyZWFtQ29uZmlnLnNpbmdsZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGltYWdlRGF0YUxlbmd0aDsgaSArPSA0LCBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhW2pdID0gaW1hZ2VEYXRhW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgaW1hZ2VEYXRhTGVuZ3RoOyBpICs9IDQsIGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFbal0gPSAwLjI5OSAqIGltYWdlRGF0YVtpXSArIDAuNTg3ICogaW1hZ2VEYXRhW2kgKyAxXSArIDAuMTE0ICogaW1hZ2VEYXRhW2kgKyAyXSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmaW5kVGFnc0luT2JqZWN0VVJMLCBUYWdzIH0gZnJvbSAnLi9leGlmLWhlbHBlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VJbmZvIHtcbiAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbiAgICB0YWdzPzogVGFncztcbn1cblxuZXhwb3J0IGNsYXNzIEltYWdlTG9hZGVyIHtcbiAgICBzdGF0aWMgYXN5bmMgbG9hZChcbiAgICAgICAgYmFzZVVyaTogc3RyaW5nLFxuICAgICAgICBjYWxsYmFjazogKF86IEFycmF5PEltYWdlSW5mbz4pID0+IHZvaWQsXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxuICAgICAgICBzaXplOiBudW1iZXIsXG4gICAgICAgIHNlcXVlbmNlOiBib29sZWFuXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGltYWdlU3JjcyA9IG5ldyBBcnJheTxzdHJpbmc+KHNpemUpO1xuICAgICAgICBjb25zdCBsb2FkZWRJbWFnZXMgPSBuZXcgQXJyYXk8SW1hZ2VJbmZvPihzaXplKTtcbiAgICAgICAgY29uc3Qgbm90TG9hZGVkSW1hZ2VzID0gbmV3IEFycmF5PEhUTUxJbWFnZUVsZW1lbnQ+KCk7XG5cbiAgICAgICAgaWYgKHNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaW1hZ2VTcmNzWzBdID0gYmFzZVVyaTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VTcmNzW2ldID0gYCR7YmFzZVVyaX1pbWFnZS0keygnMDAnICsgKG9mZnNldCArIGkpKS5zbGljZSgtMyl9LmpwZ2A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZVNyY3MuZm9yRWFjaChzcmMgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIG5vdExvYWRlZEltYWdlcy5wdXNoKGltYWdlKTtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IGxvYWRlZChpbWFnZSk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBzcmM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRlZChsb2FkZWRJbWFnZTogSFRNTEltYWdlRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBub3RMb2FkZWRJbWFnZXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm90TG9hZGVkSW1hZ2VzW3hdID09PSBsb2FkZWRJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICBub3RMb2FkZWRJbWFnZXMuc3BsaWNlKHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhc3N1bWUgdGhlIGluZGV4IGlzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaW1hZ2VTcmNzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBpbWFnZVNyY3NbeV0uc3Vic3RyKGltYWdlU3Jjc1t5XS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZS5zcmMubGFzdEluZGV4T2YoaW1hZ2VOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRJbWFnZXNbeV0gPSB7IGltYWdlOiBsb2FkZWRJbWFnZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RMb2FkZWRJbWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ltYWdlcyBsb2FkZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJbWFnZSA9IGxvYWRlZEltYWdlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW1hZ2UudGFncyA9IGF3YWl0IGZpbmRUYWdzSW5PYmplY3RVUkwoYmFzZVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobG9hZGVkSW1hZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJbWFnZUluZm8sIEltYWdlTG9hZGVyIH0gZnJvbSAnLi9pbWFnZS1sb2FkZXInO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vaW5wdXQtc3RyZWFtLWNvbmZpZyc7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZVN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHtcbiAgICBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZW5kZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZnJhbWVJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2ltYWdlczogQXJyYXk8SW1hZ2VJbmZvPjtcbiAgICBwcml2YXRlIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfcGF1c2VkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX3NpemU6IG51bWJlcjtcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fY2FudmFzSGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5fY2FudmFzV2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZnJhbWVJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2ltYWdlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSAxO1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fd2lkdGggPSAwO1xuICAgIH1cblxuICAgIGdldCByZWFsSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpZygpOiBJbnB1dFN0cmVhbUNvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgc2V0IGNvbmZpZyhjb25maWc6IElucHV0U3RyZWFtQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb25maWcuc3JjO1xuICAgICAgICB0aGlzLl9zaXplID0gY29uZmlnLnNlcXVlbmNlICYmIGNvbmZpZy5sZW5ndGggPyBjb25maWcubGVuZ3RoIDogMTtcblxuICAgICAgICB0aGlzLl9sb2FkSW1hZ2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQ7XG4gICAgfVxuXG4gICAgc2V0QXR0cmlidXRlKCkgeyB9XG5cbiAgICBwYXVzZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwbGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXQgY3VycmVudFRpbWUodGltZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lSW5kZXggPSB0aW1lO1xuICAgIH1cblxuICAgIGdldEZyYW1lKCk6IEhUTUxWaWRlb0VsZW1lbnQgfCBJbWFnZUluZm8ge1xuICAgICAgICBsZXQgZnJhbWU6IEltYWdlSW5mbyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCAmJiAhdGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICBmcmFtZSA9IHRoaXMuX2ltYWdlc1t0aGlzLl9mcmFtZUluZGV4XTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZyYW1lSW5kZXggPCAodGhpcy5fc2l6ZSAtIDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJhbWVJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2VuZGVkJywgW10pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2xvYWRJbWFnZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICBJbWFnZUxvYWRlci5sb2FkKHRoaXMuX2Jhc2VVcmwsIGltYWdlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pbWFnZXMgPSBpbWFnZXM7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoaW1hZ2VzWzBdLnRhZ3MgJiYgaW1hZ2VzWzBdLnRhZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgY2FzZSA4OiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gaW1hZ2VzWzBdLmltYWdlLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaW1hZ2VzWzBdLmltYWdlLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl93aWR0aCA9IGltYWdlc1swXS5pbWFnZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaW1hZ2VzWzBdLmltYWdlLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gdGhpcy5fY2FsY3VsYXRlZFdpZHRoID0gdGhpcy5fY29uZmlnLnNpemUgPyB0aGlzLl93aWR0aCA+IHRoaXMuX2hlaWdodCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnNpemUgOiB0aGlzLl93aWR0aCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gdGhpcy5faGVpZ2h0IHwgMCA6IHRoaXMuX3dpZHRoO1xuICAgICAgICAgICAgdGhpcy5fY2FudmFzSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlZEhlaWdodCA9IHRoaXMuX2NvbmZpZy5zaXplID8gdGhpcy5fd2lkdGggPiB0aGlzLl9oZWlnaHQgP1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gdGhpcy5fd2lkdGggfCAwIDogdGhpcy5fY29uZmlnLnNpemUgOiB0aGlzLl9oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJbmRleCA9IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJpZ2dlcignY2FucmVjb3JkJywgW10pLCAwKTtcbiAgICAgICAgfSwgdGhpcy5fb2Zmc2V0LCB0aGlzLl9zaXplLCB0aGlzLl9jb25maWcuc2VxdWVuY2UpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IEJhcmNvZGVMb2NhdG9yQ29uZmlnLCBQYXRjaFNpemVDb25maWcgfSBmcm9tICcuLi9sb2NhdG9yL2JhcmNvZGUtbG9jYXRvci1jb25maWcnO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBBcmVhQ29uZmlnIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0tY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb24ge1xuICAgIHVuaXQ6ICclJyB8ICdweCcsXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gX2NvbXB1dGVEaXZpc29ycyhuOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICBjb25zdCBkaXZpc29ycyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgY29uc3QgbGFyZ2VEaXZpc29ycyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cbiAgICBmb3IgKGxldCBkaXZpc29yID0gMTsgZGl2aXNvciAqIGRpdmlzb3IgPD0gbjsgZGl2aXNvcisrKSB7XG4gICAgICAgIGlmIChuICUgZGl2aXNvciA9PT0gMCkge1xuICAgICAgICAgICAgZGl2aXNvcnMucHVzaChkaXZpc29yKTtcbiAgICAgICAgICAgIGlmIChkaXZpc29yICogZGl2aXNvciAhPT0gbikge1xuICAgICAgICAgICAgICAgIGxhcmdlRGl2aXNvcnMudW5zaGlmdChuIC8gZGl2aXNvciB8IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpdmlzb3JzLmNvbmNhdChsYXJnZURpdmlzb3JzKTtcbn1cblxuZnVuY3Rpb24gX2NvbXB1dGVDb21tb25EaXZpc29ycyhtOiBudW1iZXIsIG46IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmIChtID09PSBuKSB7XG4gICAgICAgIHJldHVybiBfY29tcHV0ZURpdmlzb3JzKG0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IG0gPiBuID8gbSA6IG47XG4gICAgY29uc3QgbWluID0gbSA+IG4gPyBuIDogbTtcbiAgICBjb25zdCBkaXZpc29ycyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgY29uc3QgbGFyZ2VEaXZpc29ycyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cbiAgICBmb3IgKGxldCBkaXZpc29yID0gMTsgZGl2aXNvciAqIGRpdmlzb3IgPD0gbWluOyBkaXZpc29yKyspIHtcbiAgICAgICAgaWYgKG1heCAlIGRpdmlzb3IgPT09IDAgJiYgbWluICUgZGl2aXNvciA9PT0gMCkge1xuICAgICAgICAgICAgZGl2aXNvcnMucHVzaChkaXZpc29yKTtcbiAgICAgICAgICAgIGNvbnN0IGxhcmdlRGl2aXNvciA9IG1pbiAvIGRpdmlzb3IgfCAwO1xuICAgICAgICAgICAgaWYgKGRpdmlzb3IgIT09IGxhcmdlRGl2aXNvciAmJiBtYXggJSBsYXJnZURpdmlzb3IgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsYXJnZURpdmlzb3JzLnVuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaXZpc29ycy5jb25jYXQobGFyZ2VEaXZpc29ycyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVQYXRjaFNpemUocGF0Y2hTaXplOiBQYXRjaFNpemVDb25maWcsIHsgeCwgeSB9OiBQb2ludCk6IFBvaW50IHtcbiAgICBjb25zdCB3aWRlU2lkZSA9IE1hdGgubWF4KHggfCAwLCB5IHwgMCkgfCAwO1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzTGlzdCA9IFs4LCAxMCwgMTUsIDIwLCAzMiwgNjAsIDgwXTtcbiAgICBjb25zdCBuck9mUGF0Y2hlc01hcCA9IHtcbiAgICAgICAgJ3gtc21hbGwnOiA1LFxuICAgICAgICBzbWFsbDogNCxcbiAgICAgICAgbWVkaXVtOiAzLFxuICAgICAgICBsYXJnZTogMixcbiAgICAgICAgJ3gtbGFyZ2UnOiAxXG4gICAgfTtcbiAgICBjb25zdCBuck9mUGF0Y2hlc0luZGV4ID0gbnJPZlBhdGNoZXNNYXBbcGF0Y2hTaXplXSB8fCBuck9mUGF0Y2hlc01hcC5tZWRpdW0gfCAwO1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzID0gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSW5kZXhdIHwgMDtcbiAgICBjb25zdCBkZXNpcmVkUGF0Y2hTaXplID0gd2lkZVNpZGUgLyBuck9mUGF0Y2hlcyB8IDA7XG5cbiAgICBmdW5jdGlvbiBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoZGl2aXNvcnM6IEFycmF5PG51bWJlcj4pOiBQb2ludCB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGZvdW5kID0gZGl2aXNvcnNbZGl2aXNvcnMubGVuZ3RoID4+IDFdIHwgMDtcblxuICAgICAgICB3aGlsZSAoaSA8IChkaXZpc29ycy5sZW5ndGggLSAxKSAmJiBkaXZpc29yc1tpXSA8IGRlc2lyZWRQYXRjaFNpemUpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkaXZpc29yc1tpXSAtIGRlc2lyZWRQYXRjaFNpemUpID4gTWF0aC5hYnMoZGl2aXNvcnNbaSAtIDFdIC0gZGVzaXJlZFBhdGNoU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGRpdmlzb3JzW2kgLSAxXSB8IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZGl2aXNvcnNbaV0gfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNpcmVkUGF0Y2hTaXplIC8gZm91bmQgPCBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJbmRleCArIDFdIC8gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSW5kZXhdICYmXG4gICAgICAgICAgICBkZXNpcmVkUGF0Y2hTaXplIC8gZm91bmQgPiBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJbmRleCAtIDFdIC8gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSW5kZXhdKSB7XG4gICAgICAgICAgICByZXR1cm4geyB4OiBmb3VuZCwgeTogZm91bmQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpbWFsUGF0Y2hTaXplID0gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKF9jb21wdXRlQ29tbW9uRGl2aXNvcnMoeCwgeSkpIHx8XG4gICAgICAgIGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhfY29tcHV0ZURpdmlzb3JzKHdpZGVTaWRlKSkgfHxcbiAgICAgICAgZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKF9jb21wdXRlRGl2aXNvcnMoZGVzaXJlZFBhdGNoU2l6ZSAqIG5yT2ZQYXRjaGVzKSk7XG5cbiAgICByZXR1cm4gb3B0aW1hbFBhdGNoU2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW1hZ2VDb25zdHJhaW50cyhpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0sIGNvbmZpZzogQmFyY29kZUxvY2F0b3JDb25maWcpIHtcbiAgICBsZXQgd2lkdGggPSBpbnB1dFN0cmVhbS53aWR0aDtcbiAgICBsZXQgaGVpZ2h0ID0gaW5wdXRTdHJlYW0uaGVpZ2h0O1xuICAgIGNvbnN0IHNoaWZ0ID0gY29uZmlnLmhhbGZTYW1wbGUgPyAxIDogMCB8IDA7XG4gICAgY29uc3QgaW5wdXRTdHJlYW1Db25maWcgPSBpbnB1dFN0cmVhbS5jb25maWc7XG5cbiAgICAvLyBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBhcmVhXG4gICAgaWYgKGlucHV0U3RyZWFtQ29uZmlnICYmIGlucHV0U3RyZWFtQ29uZmlnLmFyZWEpIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IGNvbXB1dGVJbWFnZUFyZWEod2lkdGgsIGhlaWdodCwgaW5wdXRTdHJlYW1Db25maWcuYXJlYSk7XG4gICAgICAgIGlucHV0U3RyZWFtLnRvcExlZnQgPSBhcmVhLnRvcExlZnQ7XG4gICAgICAgIGlucHV0U3RyZWFtLnNldENhbnZhc1NpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHdpZHRoID0gYXJlYS53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gYXJlYS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2l6ZSA9IHtcbiAgICAgICAgeDogd2lkdGggPj4gc2hpZnQsXG4gICAgICAgIHk6IGhlaWdodCA+PiBzaGlmdFxuICAgIH07XG5cbiAgICBjb25zdCBwYXRjaFNpemUgPSBjYWxjdWxhdGVQYXRjaFNpemUoY29uZmlnLnBhdGNoU2l6ZSwgc2l6ZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1BhdGNoLVNpemU6JywgSlNPTi5zdHJpbmdpZnkocGF0Y2hTaXplKSk7XG4gICAgfVxuXG4gICAgaW5wdXRTdHJlYW0ud2lkdGggPSAoc2l6ZS54IC8gcGF0Y2hTaXplLnggPDwgc2hpZnQpICogcGF0Y2hTaXplLnggfCAwO1xuICAgIGlucHV0U3RyZWFtLmhlaWdodCA9IChzaXplLnkgLyBwYXRjaFNpemUueSA8PCBzaGlmdCkgKiBwYXRjaFNpemUueSB8IDA7XG5cbiAgICBpZiAoKGlucHV0U3RyZWFtLndpZHRoICUgcGF0Y2hTaXplLngpID09PSAwICYmIChpbnB1dFN0cmVhbS5oZWlnaHQgJSBwYXRjaFNpemUueSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzOiB3aWR0aCAoJHt3aWR0aH0pIGFuZCBoZWlnaHQgKCR7aGVpZ2h0fSkgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7cGF0Y2hTaXplLnh9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcGFyc2VDc3NEaW1lbnNpb25WYWx1ZXModmFsdWU6IHN0cmluZyk6IERpbWVuc2lvbiB7XG4gICAgY29uc3QgZGltZW5zaW9uOiBEaW1lbnNpb24gPSB7XG4gICAgICAgIHZhbHVlOiBwYXJzZUZsb2F0KHZhbHVlKSxcbiAgICAgICAgdW5pdDogdmFsdWUuaW5kZXhPZignJScpID09PSB2YWx1ZS5sZW5ndGggLSAxID8gJyUnIDogdmFsdWUuaW5kZXhPZigncHgnKSA9PT0gdmFsdWUubGVuZ3RoIC0gMiA/ICdweCcgOiAnJSdcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbn1cblxuZXhwb3J0IGNvbnN0IF9kaW1lbnNpb25zQ29udmVydGVycyA9IHtcbiAgICBib3R0b206IChkaW1lbnNpb246IERpbWVuc2lvbiwgeyBoZWlnaHQgfSkgPT4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/XG4gICAgICAgIGhlaWdodCAtIGhlaWdodCAqIGRpbWVuc2lvbi52YWx1ZSAvIDEwMCB8IDAgOiBkaW1lbnNpb24udW5pdCA9PT0gJ3B4JyA/IGhlaWdodCAtIGRpbWVuc2lvbi52YWx1ZSA6IGhlaWdodCxcbiAgICBsZWZ0OiAoZGltZW5zaW9uOiBEaW1lbnNpb24sIHsgd2lkdGggfSkgPT4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/XG4gICAgICAgIHdpZHRoICogZGltZW5zaW9uLnZhbHVlIC8gMTAwIHwgMCA6IGRpbWVuc2lvbi51bml0ID09PSAncHgnID8gZGltZW5zaW9uLnZhbHVlIDogMCxcbiAgICByaWdodDogKGRpbWVuc2lvbjogRGltZW5zaW9uLCB7IHdpZHRoIH0pID0+IGRpbWVuc2lvbi51bml0ID09PSAnJScgP1xuICAgICAgICB3aWR0aCAtIHdpZHRoICogZGltZW5zaW9uLnZhbHVlIC8gMTAwIHwgMCA6IGRpbWVuc2lvbi51bml0ID09PSAncHgnID8gd2lkdGggLSBkaW1lbnNpb24udmFsdWUgOiB3aWR0aCxcbiAgICB0b3A6IChkaW1lbnNpb246IERpbWVuc2lvbiwgeyBoZWlnaHQgfSk6IG51bWJlciA9PiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID9cbiAgICAgICAgaGVpZ2h0ICogZGltZW5zaW9uLnZhbHVlIC8gMTAwIHwgMCA6IGRpbWVuc2lvbi51bml0ID09PSAncHgnID8gZGltZW5zaW9uLnZhbHVlIDogMFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbWFnZUFyZWEoaW5wdXRXaWR0aDogbnVtYmVyLCBpbnB1dEhlaWdodDogbnVtYmVyLCBhcmVhOiBBcmVhQ29uZmlnKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHsgd2lkdGg6IGlucHV0V2lkdGgsIGhlaWdodDogaW5wdXRIZWlnaHQgfTtcbiAgICBjb25zdCBwYXJzZWRBcmVhOiB7XG4gICAgICAgIGJvdHRvbT86IG51bWJlcjtcbiAgICAgICAgbGVmdD86IG51bWJlcjtcbiAgICAgICAgcmlnaHQ/OiBudW1iZXI7XG4gICAgICAgIHRvcD86IG51bWJlcjtcbiAgICB9ID0gT2JqZWN0LmtleXMoYXJlYSkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZWFba2V5XTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ3NzRGltZW5zaW9uVmFsdWVzKHZhbHVlKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZCA9IF9kaW1lbnNpb25zQ29udmVydGVyc1trZXldKHBhcnNlZCwgY29udGV4dCk7XG5cbiAgICAgICAgcmVzdWx0W2tleV0gPSBjYWxjdWxhdGVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRvcExlZnQ6IHsgeDogcGFyc2VkQXJlYS5sZWZ0LCB5OiBwYXJzZWRBcmVhLnRvcCB9LFxuICAgICAgICB3aWR0aDogcGFyc2VkQXJlYS5yaWdodCAtIHBhcnNlZEFyZWEubGVmdCxcbiAgICAgICAgaGVpZ2h0OiBwYXJzZWRBcmVhLmJvdHRvbSAtIHBhcnNlZEFyZWEudG9wXG4gICAgfTtcbn1cbiIsImltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IEltYWdlSW5mbyB9IGZyb20gJy4vaW1hZ2UtbG9hZGVyJztcbmltcG9ydCB7IElucHV0U3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0tY29uZmlnJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElucHV0U3RyZWFtIHtcbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZWRXaWR0aDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY2FudmFzSGVpZ2h0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9jYW52YXNXaWR0aDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY29uZmlnOiBJbnB1dFN0cmVhbUNvbmZpZztcbiAgICBwcm90ZWN0ZWQgX2V2ZW50TmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgcHJvdGVjdGVkIF9ldmVudEhhbmRsZXJzOiBNYXA8c3RyaW5nLCBBcnJheTxFdmVudExpc3RlbmVyPj47XG4gICAgcHJvdGVjdGVkIF90b3BMZWZ0OiBQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9jYW52YXNXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PEV2ZW50TGlzdGVuZXI+PigpO1xuICAgICAgICB0aGlzLl90b3BMZWZ0ID0geyB4OiAwLCB5OiAwIH07XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IHJlYWxIZWlnaHQoKTogbnVtYmVyO1xuXG4gICAgYWJzdHJhY3QgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXI7XG5cbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgIH1cblxuICAgIHNldCBoZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlZEhlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZWRXaWR0aDtcbiAgICB9XG5cbiAgICBzZXQgd2lkdGgod2lkdGg6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9jYWxjdWxhdGVkV2lkdGggPSB3aWR0aDtcbiAgICB9XG5cbiAgICBnZXQgdG9wTGVmdCgpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcExlZnQgfTtcbiAgICB9XG5cbiAgICBzZXQgdG9wTGVmdCh0b3BMZWZ0OiBQb2ludCkge1xuICAgICAgICB0aGlzLl90b3BMZWZ0LnggPSB0b3BMZWZ0Lng7XG4gICAgICAgIHRoaXMuX3RvcExlZnQueSA9IHRvcExlZnQueTtcbiAgICB9XG5cbiAgICBzZXRDYW52YXNTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgY2FudmFzSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNIZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IGNhbnZhc1dpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNXaWR0aDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgY29uZmlnKCk6IElucHV0U3RyZWFtQ29uZmlnO1xuXG4gICAgYWJzdHJhY3Qgc2V0IGNvbmZpZyhjb25maWc6IElucHV0U3RyZWFtQ29uZmlnKTtcblxuICAgIGFic3RyYWN0IGdldCBlbmRlZCgpOiBib29sZWFuO1xuXG4gICAgYWJzdHJhY3Qgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBwYXVzZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgcGxheSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2V0IGN1cnJlbnRUaW1lKHRpbWU6IG51bWJlcik7XG5cbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLCBfb3B0aW9ucz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50SGFuZGxlcnMuaGFzKGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuc2V0KGV2ZW50LCBuZXcgQXJyYXk8RXZlbnRMaXN0ZW5lcj4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLmdldChldmVudCkucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdBcnJheT86IGFueSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50SGFuZGxlcnMuZ2V0KGV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4gaGFuZGxlci5hcHBseSh0aGlzLCBhcmdBcnJheSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0RnJhbWUoKTogSFRNTFZpZGVvRWxlbWVudCB8IEltYWdlSW5mbztcbn1cbiIsImltcG9ydCB7IFZpZGVvU3RyZWFtIH0gZnJvbSAnLi92aWRlby1zdHJlYW0nO1xuXG5leHBvcnQgY2xhc3MgTGl2ZVN0cmVhbSBleHRlbmRzIFZpZGVvU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWRlbzogSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJycpO1xuICAgICAgICBzdXBlcih2aWRlbyk7XG4gICAgfVxuXG4gICAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW1hZ2VJbmZvIH0gZnJvbSAnLi9pbWFnZS1sb2FkZXInO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vaW5wdXQtc3RyZWFtLWNvbmZpZyc7XG5cbmV4cG9ydCBjbGFzcyBWaWRlb1N0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHtcbiAgICBwcml2YXRlIF92aWRlbzogSFRNTFZpZGVvRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fdmlkZW8gPSB2aWRlbztcbiAgICB9XG5cbiAgICBnZXQgcmVhbEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlkZW8udmlkZW9XaWR0aDtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCk6IElucHV0U3RyZWFtQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG5cbiAgICBzZXQgY29uZmlnKGNvbmZpZzogSW5wdXRTdHJlYW1Db25maWcpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgICAgICAgdGhpcy5fdmlkZW8uc3JjID0gY29uZmlnLnNyYyB8fCAnJztcbiAgICB9XG5cbiAgICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWRlby5lbmRlZDtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZGVvLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcGF1c2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZGVvLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcGxheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmlkZW8ucGxheSgpO1xuICAgIH1cblxuICAgIHNldCBjdXJyZW50VGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy50eXBlICE9PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvLmN1cnJlbnRUaW1lID0gdGltZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXIsIG9wdGlvbnM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5fZXZlbnROYW1lcy5pbmRleE9mKGV2ZW50KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETzogY29tZSB1cCB3aXRoIGEgd2F5IHRvIHJlbW92ZSB2aWRlbyBldmVudCBoYW5kbGVyc1xuICAgICAgICAvLyB0aGlzLl9ldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fZXZlbnRIYW5kbGVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgLy8gICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHRoaXMuX3ZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICBzdXBlci5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdBcnJheT86IGFueSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAnY2FucmVjb3JkJykge1xuICAgICAgICAgICAgdGhpcy5faW5pdFNpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLnRyaWdnZXIoZXZlbnROYW1lLCBhcmdBcnJheSlcbiAgICB9XG5cbiAgICBnZXRGcmFtZSgpOiBIVE1MVmlkZW9FbGVtZW50IHwgSW1hZ2VJbmZvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZGVvO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRTaXplKCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX3ZpZGVvLnZpZGVvV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuX3ZpZGVvLnZpZGVvSGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gdGhpcy5fY2FsY3VsYXRlZFdpZHRoID1cbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zaXplID8gd2lkdGggPiBoZWlnaHQgPyB0aGlzLl9jb25maWcuc2l6ZSA6IHdpZHRoICogdGhpcy5fY29uZmlnLnNpemUgLyBoZWlnaHQgfCAwIDogd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IHRoaXMuX2NhbGN1bGF0ZWRIZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLnNpemUgPyB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gd2lkdGggfCAwIDogdGhpcy5fY29uZmlnLnNpemUgOiBoZWlnaHQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGl2ZVN0cmVhbSBleHRlbmRzIFZpZGVvU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWRlbzogSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJycpO1xuICAgICAgICBzdXBlcih2aWRlbyk7XG4gICAgfVxuXG4gICAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW1hZ2VXcmFwcGVyIH0gZnJvbSAnLi4vY29tbW9uL2ltYWdlLXdyYXBwZXInO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9jb21tb24vcG9pbnQnO1xuXG4vKipcbiAqIEludmVydCBtYXRyaXhcbiAqIEBwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHRoZSBpbnZlcnRlZCBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydChtYXRyaXg6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgYTAgPSBtYXRyaXhbMF07XG4gICAgY29uc3QgYTEgPSBtYXRyaXhbMV07XG4gICAgY29uc3QgYTIgPSBtYXRyaXhbMl07XG4gICAgY29uc3QgYTMgPSBtYXRyaXhbM107XG4gICAgY29uc3QgZGV0ZXJtaW5hbnQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICAgIGlmICghZGV0ZXJtaW5hbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW2EzIC8gZGV0ZXJtaW5hbnQsIC1hMSAvIGRldGVybWluYW50LCAtYTIgLyBkZXRlcm1pbmFudCwgYTAgLyBkZXRlcm1pbmFudF0pO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlY3RvciB3aXRoIGEgbWF0cml4XG4gKiBAcGFyYW0geyB4LCB5IH0gdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIG1hdHJpeCBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVdpdGhNYXRyaXgoeyB4LCB5IH06IFBvaW50LCBtYXRyaXg6IEZsb2F0MzJBcnJheSk6IFBvaW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzJdICogeSxcbiAgICAgICAgeTogbWF0cml4WzFdICogeCArIG1hdHJpeFszXSAqIHlcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBfY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgYml0c1BlclBpeGVsOiBudW1iZXIpOiBJbnQzMkFycmF5IHtcbiAgICBpZiAoIWJpdHNQZXJQaXhlbCkge1xuICAgICAgICBiaXRzUGVyUGl4ZWwgPSA4O1xuICAgIH1cblxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGJpdFNoaWZ0ID0gOCAtIGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBidWNrZXRDb3VudCA9IDEgPDwgYml0c1BlclBpeGVsO1xuICAgIGNvbnN0IGhpc3RvZ3JhbSA9IG5ldyBJbnQzMkFycmF5KGJ1Y2tldENvdW50KTtcblxuICAgIGZvciAobGV0IGkgPSBpbWFnZURhdGEubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIGhpc3RvZ3JhbVtpbWFnZURhdGFbaV0gPj4gYml0U2hpZnRdKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhpc3RvZ3JhbTtcbn1cblxuZnVuY3Rpb24gX2RldGVybWluZU90c3VUaHJlc2hvbGQoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFiaXRzUGVyUGl4ZWwpIHtcbiAgICAgICAgYml0c1BlclBpeGVsID0gODtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRTaGlmdCA9IDggLSBiaXRzUGVyUGl4ZWw7XG4gICAgY29uc3QgaGlzdCA9IF9jb21wdXRlSGlzdG9ncmFtKGltYWdlV3JhcHBlciwgYml0c1BlclBpeGVsKTtcbiAgICBjb25zdCB2ZXQgPSBbMF07XG4gICAgY29uc3QgbWF4ID0gKDEgPDwgYml0c1BlclBpeGVsKSAtIDE7XG5cbiAgICBmdW5jdGlvbiBweChpbml0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGluaXQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBoaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBteChpbml0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGluaXQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBpICogaGlzdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDE7IGsgPCBtYXg7IGsrKykge1xuICAgICAgICBjb25zdCBwMSA9IHB4KDAsIGspO1xuICAgICAgICBjb25zdCBwMiA9IHB4KGsgKyAxLCBtYXgpO1xuICAgICAgICBjb25zdCBwMTIgPSBwMSAqIHAyIHx8IDE7XG4gICAgICAgIGNvbnN0IG0xID0gbXgoMCwgaykgKiBwMjtcbiAgICAgICAgY29uc3QgbTIgPSBteChrICsgMSwgbWF4KSAqIHAxO1xuICAgICAgICBjb25zdCBtMTIgPSBtMSAtIG0yO1xuICAgICAgICB2ZXRba10gPSBtMTIgKiBtMTIgLyBwMTI7XG4gICAgfVxuXG4gICAgLy8gaW5kZXggb2YgbWF4IGVsZW1lbnRcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB2ZXQucmVkdWNlKChtYXhJbmRleCwgaXRlbSwgaW5kZXgsIGFycmF5KSA9PiBpdGVtID4gYXJyYXlbbWF4SW5kZXhdID8gaW5kZXggOiBtYXhJbmRleCwgMCk7XG5cbiAgICByZXR1cm4gdGhyZXNob2xkIDw8IGJpdFNoaWZ0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgdGFyZ2V0V3JhcHBlcjogSW1hZ2VXcmFwcGVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBfZGV0ZXJtaW5lT3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIpO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSB0YXJnZXRXcmFwcGVyLmRhdGE7XG5cbiAgICBpbWFnZVdyYXBwZXIuZGF0YS5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgdGFyZ2V0RGF0YVtpbmRleF0gPSB2YWx1ZSA8IHRocmVzaG9sZCA/IDEgOiAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRocmVzaG9sZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW1hZ2VXcmFwcGVyIGlucHV0IGltYWdlIHRvIGJlIHNhbXBsZWRcbiAqIEBwYXJhbSBvdXRJbWFnZVdyYXBwZXIge0ltYWdlV3JhcHBlcn0gdG8gYmUgc3RvcmVkIGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYWxmU2FtcGxlKGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcik6IHZvaWQge1xuICAgIGNvbnN0IGltYWdlID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGNvbnN0IG91dEltYWdlID0gb3V0SW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgZW5kSW5kZXggPSBpbWFnZS5sZW5ndGg7XG4gICAgY29uc3Qgb3V0V2lkdGggPSB3aWR0aCA+PiAxO1xuICAgIGxldCB0b3BSb3dJbmRleCA9IDA7XG4gICAgbGV0IGJvdHRvbVJvd0luZGV4ID0gd2lkdGg7XG4gICAgbGV0IG91dEltZ0luZGV4ID0gMDtcblxuICAgIHdoaWxlIChib3R0b21Sb3dJbmRleCA8IGVuZEluZGV4KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0V2lkdGg7IGkrKykge1xuICAgICAgICAgICAgb3V0SW1hZ2Vbb3V0SW1nSW5kZXhdID1cbiAgICAgICAgICAgICAgICAoaW1hZ2VbdG9wUm93SW5kZXhdICsgaW1hZ2VbdG9wUm93SW5kZXggKyAxXSArIGltYWdlW2JvdHRvbVJvd0luZGV4XSArIGltYWdlW2JvdHRvbVJvd0luZGV4ICsgMV0pID4+IDI7XG4gICAgICAgICAgICBvdXRJbWdJbmRleCsrO1xuICAgICAgICAgICAgdG9wUm93SW5kZXggKz0gMjtcbiAgICAgICAgICAgIGJvdHRvbVJvd0luZGV4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgdG9wUm93SW5kZXggKz0gd2lkdGg7XG4gICAgICAgIGJvdHRvbVJvd0luZGV4ICs9IHdpZHRoO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJveCB9IGZyb20gJy4uL2NvbW1vbi9ib3gnO1xuaW1wb3J0IHsgQ2x1c3RlciB9IGZyb20gJy4uL2NvbW1vbi9jbHVzdGVyJztcbmltcG9ydCB7IEhTViwgaHN2MnJnYiwgUkdCIH0gZnJvbSAnLi4vY29tbW9uL2hzdjJyZ2InO1xuaW1wb3J0IHsgSW1hZ2VEZWJ1ZyB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS1kZWJ1Zyc7XG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICcuLi9jb21tb24vaW1hZ2Utd3JhcHBlcic7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICcuLi9jb21tb24vbW9tZW50JztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IGNhbGN1bGF0ZVBhdGNoU2l6ZSB9IGZyb20gJy4uL2lucHV0L2lucHV0LXN0cmVhbS11dGlscyc7XG5pbXBvcnQgeyBCYXJjb2RlTG9jYXRvckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1sb2NhdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBoYWxmU2FtcGxlLCBpbnZlcnQsIG90c3VUaHJlc2hvbGQsIHRyYW5zZm9ybVdpdGhNYXRyaXggfSBmcm9tICcuL2JhcmNvZGUtbG9jYXRvci11dGlscyc7XG5pbXBvcnQgeyBSYXN0ZXJpemVyIH0gZnJvbSAnLi9yYXN0ZXJpemVyJztcbmltcG9ydCBza2VsZXRvbml6ZXIgZnJvbSAnLi9za2VsZXRvbml6ZXInO1xuaW1wb3J0IHsgU2VhcmNoRGlyZWN0aW9ucyB9IGZyb20gJy4vdHJhY2VyJztcblxuaW50ZXJmYWNlIFBhdGNoIHtcbiAgICBib3g6IEJveDtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIG1vbWVudHM6IEFycmF5PE1vbWVudD47XG4gICAgcG9zOiBQb2ludDtcbiAgICByYWQ6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xufVxuXG50eXBlIFNjZWxldG9uaXplciA9IGFueTtcblxuY29uc3QgTW9tZW50U2ltaWxhcml0eVRocmVzaG9sZCA9IDAuOTtcblxuZXhwb3J0IGNsYXNzIEJhcmNvZGVMb2NhdG9yIHtcbiAgICBwcml2YXRlIF9jb25maWc6IEJhcmNvZGVMb2NhdG9yQ29uZmlnO1xuICAgIHByaXZhdGUgX2lucHV0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI7XG4gICAgcHJpdmF0ZSBfY3VycmVudEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3NrZWxJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcbiAgICBwcml2YXRlIF9zdWJJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcbiAgICBwcml2YXRlIF9sYWJlbEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyPEFycmF5PG51bWJlcj4+O1xuICAgIHByaXZhdGUgX2JpbmFyeUltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3BhdGNoR3JpZDogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3BhdGNoTGFiZWxHcmlkOiBJbWFnZVdyYXBwZXI8SW50MzJBcnJheT47XG4gICAgcHJpdmF0ZSBfaW1hZ2VUb1BhdGNoR3JpZDogQXJyYXk8UGF0Y2g+O1xuICAgIHByaXZhdGUgX3BhdGNoU2l6ZTogUG9pbnQ7XG4gICAgcHJpdmF0ZSBfYmluYXJ5Q29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHByaXZhdGUgX251bVBhdGNoZXM6IFBvaW50O1xuICAgIHByaXZhdGUgX3NrZWxldG9uaXplcjogU2NlbGV0b25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXRJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgY29uZmlnOiBCYXJjb2RlTG9jYXRvckNvbmZpZykge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyID0gaW5wdXRJbWFnZVdyYXBwZXI7XG4gICAgICAgIHRoaXMuX251bVBhdGNoZXMgPSB7IHg6IDAsIHk6IDAgfTtcblxuICAgICAgICB0aGlzLl9pbml0QnVmZmVycygpO1xuICAgICAgICB0aGlzLl9pbml0Q2FudmFzKCk7XG4gICAgfVxuXG4gICAgbG9jYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgICAgIGhhbGZTYW1wbGUodGhpcy5faW5wdXRJbWFnZVdyYXBwZXIsIHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYmluYXJpemVJbWFnZSgpO1xuICAgICAgICBjb25zdCBwYXRjaGVzRm91bmQgPSB0aGlzLl9maW5kUGF0Y2hlcygpO1xuICAgICAgICAvLyByZXR1cm4gdW5sZXNzIDUlIG9yIG1vcmUgcGF0Y2hlcyBhcmUgZm91bmRcbiAgICAgICAgaWYgKHBhdGNoZXNGb3VuZC5sZW5ndGggPCB0aGlzLl9udW1QYXRjaGVzLnggKiB0aGlzLl9udW1QYXRjaGVzLnkgKiAwLjA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJhc3Rlcml6ZSBhcmVhIGJ5IGNvbXBhcmluZyBhbmd1bGFyIHNpbWlsYXJpdHk7XG4gICAgICAgIGNvbnN0IG1heExhYmVsID0gdGhpcy5fcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKTtcbiAgICAgICAgaWYgKG1heExhYmVsIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWFyY2ggZm9yIGFyZWEgd2l0aCB0aGUgbW9zdCBwYXRjaGVzIChiaWdnZXN0IGNvbm5lY3RlZCBhcmVhKVxuICAgICAgICBjb25zdCB0b3BMYWJlbHMgPSB0aGlzLl9maW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKTtcbiAgICAgICAgaWYgKHRvcExhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm94ZXMgPSB0aGlzLl9maW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCk7XG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0QnVmZmVycygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5oYWxmU2FtcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gMiB8IDAsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gMiB8IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlV3JhcHBlciA9IHRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKHRoaXMuX2NvbmZpZy5wYXRjaFNpemUsIHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZSk7XG5cbiAgICAgICAgdGhpcy5fbnVtUGF0Y2hlcy54ID0gdGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyB0aGlzLl9wYXRjaFNpemUueCB8IDA7XG4gICAgICAgIHRoaXMuX251bVBhdGNoZXMueSA9IHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gdGhpcy5fcGF0Y2hTaXplLnkgfCAwO1xuXG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLCB1bmRlZmluZWQsIFVpbnQ4QXJyYXksIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9sYWJlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fcGF0Y2hTaXplLCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcblxuICAgICAgICBjb25zdCBza2VsZXRvbkltYWdlRGF0YSA9IG5ldyBBcnJheUJ1ZmZlcig2NCAqIDEwMjQpO1xuICAgICAgICB0aGlzLl9zdWJJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKHRoaXMuX3BhdGNoU2l6ZSwgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIDAsIHRoaXMuX3BhdGNoU2l6ZS54ICogdGhpcy5fcGF0Y2hTaXplLnkpKTtcbiAgICAgICAgdGhpcy5fc2tlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fcGF0Y2hTaXplLFxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIHRoaXMuX3BhdGNoU2l6ZS54ICogdGhpcy5fcGF0Y2hTaXplLnkgKiAzLCB0aGlzLl9wYXRjaFNpemUueCAqIHRoaXMuX3BhdGNoU2l6ZS55KSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3NrZWxldG9uaXplciA9IHNrZWxldG9uaXplcihcbiAgICAgICAgICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSA/IHNlbGYgOiBnbG9iYWwsXG4gICAgICAgICAgICB7IHNpemU6IHRoaXMuX3BhdGNoU2l6ZS54IH0sXG4gICAgICAgICAgICBza2VsZXRvbkltYWdlRGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNpemUgPSB7XG4gICAgICAgICAgICB4OiAodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54KSB8IDAsXG4gICAgICAgICAgICB5OiAodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnkgLyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55KSB8IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcGF0Y2hMYWJlbEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKHNpemUsIHVuZGVmaW5lZCwgSW50MzJBcnJheSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3BhdGNoR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoc2l6ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB0aGlzLl9pbWFnZVRvUGF0Y2hHcmlkID0gbmV3IEFycmF5PFBhdGNoPih0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdENhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy51c2VXb3JrZXIgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5jbGFzc05hbWUgPSAnYmluYXJ5QnVmZmVyJztcbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZyAmJiB0aGlzLl9jb25maWcuZGVidWcuc2hvd0NhbnZhcykge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlYnVnJykuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5hcnlDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJvdW5kaW5nIGJveCB3aGljaCBlbmNsb3NlcyBhbGwgdGhlIGdpdmVuIHBhdGNoZXNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWluaW1hbCBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBwcml2YXRlIF9ib3hGcm9tUGF0Y2hlcyhwYXRjaGVzOiBBcnJheTxQYXRjaD4pOiBCb3gge1xuICAgICAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5fY29uZmlnLmRlYnVnO1xuICAgICAgICBsZXQgYXZlcmFnZVJhZCA9IHBhdGNoZXMucmVkdWNlKChzdW0sIHsgcG9zLCByYWQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dQYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gZHJhdyBhbGwgcGF0Y2hlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1JlY3QocG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgJ3JlZCcsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc3VtICsgcmFkO1xuICAgICAgICB9LCAwKSAvIHBhdGNoZXMubGVuZ3RoO1xuXG4gICAgICAgIGF2ZXJhZ2VSYWQgPSAoYXZlcmFnZVJhZCAqIDE4MCAvIE1hdGguUEkgKyA5MCkgJSAxODAgLSA5MDtcbiAgICAgICAgaWYgKGF2ZXJhZ2VSYWQgPCAwKSB7XG4gICAgICAgICAgICBhdmVyYWdlUmFkICs9IDE4MDtcbiAgICAgICAgfVxuICAgICAgICBhdmVyYWdlUmFkID0gKDE4MCAtIGF2ZXJhZ2VSYWQpICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhdmVyYWdlUmFkKTtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYXZlcmFnZVJhZCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoW2Nvcywgc2luLCAtc2luLCBjb3NdKTtcbiAgICAgICAgY29uc3QgaW52ZXJzZU1hdHJpeCA9IGludmVydChtYXRyaXgpO1xuXG4gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBwYXRjaGVzIGFuZCByb3RhdGUgYnkgYW5nbGVcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKCh7IGJveCB9KSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgIGJveFtqXSA9IHRyYW5zZm9ybVdpdGhNYXRyaXgoYm94W2pdLCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd1RyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1BhdGgoYm94LCAnIzk5ZmYwMCcsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgbWluWCA9IHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIGxldCBtaW5ZID0gdGhpcy5fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICAgICAgbGV0IG1heFggPSAtbWluWDtcbiAgICAgICAgbGV0IG1heFkgPSAtbWluWTtcblxuICAgICAgICAvLyBmaW5kIGJvdW5kaW5nIGJveFxuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHsgYm94IH0pID0+IHtcbiAgICAgICAgICAgIGJveC5mb3JFYWNoKCh7IHgsIHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4IDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHggPiBtYXhYKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFggPSB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh5ID4gbWF4WSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGJveDogQm94ID0gW3sgeDogbWluWCwgeTogbWluWSB9LCB7IHg6IG1heFgsIHk6IG1pblkgfSwgeyB4OiBtYXhYLCB5OiBtYXhZIH0sIHsgeDogbWluWCwgeTogbWF4WSB9XTtcblxuICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd1RyYW5zZm9ybWVkQm94KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UGF0aChib3gsICcjZmYwMDAwJywgMik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXZlcnNlIHJvdGF0aW9uXG4gICAgICAgIGJveCA9IGJveC5tYXAodmVydGV4ID0+IHRyYW5zZm9ybVdpdGhNYXRyaXgodmVydGV4LCBpbnZlcnNlTWF0cml4KSkgYXMgQm94O1xuXG4gICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93QkIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdQYXRoKGJveCwgJyNmZjAwMDAnLCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaGFsZlNhbXBsZSkge1xuICAgICAgICAgICAgLy8gc2NhbGVcbiAgICAgICAgICAgIGJveCA9IGJveC5tYXAoKHsgeCwgeSB9KSA9PiAoeyB4OiB4ICogMiwgeTogeSAqPSAyIH0pKSBhcyBCb3g7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm94O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiaW5hcnkgaW1hZ2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIF9iaW5hcml6ZUltYWdlKCk6IHZvaWQge1xuICAgICAgICBvdHN1VGhyZXNob2xkKHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIsIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlcik7XG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci56ZXJvQm9yZGVyKCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5fY29uZmlnLmRlYnVnICYmIHRoaXMuX2NvbmZpZy5kZWJ1Zy5zaG93Q2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5hcnlJbWFnZVdyYXBwZXIuc2hvdyh0aGlzLl9iaW5hcnlDb250ZXh0LCAyNTUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgaW1hZ2UsIGV4dHJhY3QgcGF0Y2hlc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRQYXRjaGVzKCk6IEFycmF5PFBhdGNoPiB7XG4gICAgICAgIGNvbnN0IGRlYnVnID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWc7XG4gICAgICAgIGxldCBwYXRjaGVzRm91bmQgPSBuZXcgQXJyYXk8UGF0Y2g+KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9udW1QYXRjaGVzLng7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9udW1QYXRjaGVzLnk7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54ICogaTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5fc3ViSW1hZ2VXcmFwcGVyLnNpemUueSAqIGo7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXBlcmF0ZSBwYXJ0c1xuICAgICAgICAgICAgICAgIHRoaXMuX3NrZWxldG9uaXplKHgsIHkpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmFzdGVyaXplLCBmaW5kIGluZGl2aWR1YWwgYmFyc1xuICAgICAgICAgICAgICAgIHRoaXMuX3NrZWxJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsSW1hZ2VXcmFwcGVyLmRhdGEuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCByYXN0ZXJpemVyID0gbmV3IFJhc3Rlcml6ZXIodGhpcy5fc2tlbEltYWdlV3JhcHBlciwgdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhc3RlclJlc3VsdCA9IHJhc3Rlcml6ZXIucmFzdGVyaXplKDApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIub3ZlcmxheSh0aGlzLl9iaW5hcnlDb250ZXh0LCAzNjAgLyByYXN0ZXJSZXN1bHQuY291bnQgfCAwLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbW9tZW50cyBmcm9tIHRoZSBza2VsZXRvbml6ZWQgcGF0Y2hcbiAgICAgICAgICAgICAgICBjb25zdCBtb21lbnRzID0gdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIubW9tZW50cyhyYXN0ZXJSZXN1bHQuY291bnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBlbGlnaWJsZSBwYXRjaGVzXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0Y2ggPSB0aGlzLl9kZXNjcmliZVBhdGNoKG1vbWVudHMsIGogKiB0aGlzLl9udW1QYXRjaGVzLnggKyBpLCB4LCB5KTtcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hlc0ZvdW5kLnB1c2gocGF0Y2gpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5zaG93Rm91bmRQYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3UmVjdChwYXRjaC5wb3MsIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLCAnIzk5ZmYwMCcsIDIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aG9zZSBjb25uZWN0ZWQgYXJlYXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCA2IHBhdGNoZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVtIG9yZGVyZWQgREVTQyBieSB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lZCBwYXRjaGVzXG4gICAgICogQHBhcmFtIG1heExhYmVsXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyhtYXhMYWJlbDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIGxldCBsYWJlbEhpc3QgPSBuZXcgQXJyYXk8bnVtYmVyPihtYXhMYWJlbCkuZmlsbCgwKTtcblxuICAgICAgICB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmZvckVhY2goKGRhdGE6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxIaXN0W2RhdGEgLSAxXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBleHRyYWN0IHRvcCBhcmVhcyB3aXRoIGF0IGxlYXN0IDYgcGF0Y2hlcyBwcmVzZW50XG4gICAgICAgIGNvbnN0IHRvcExhYmVscyA9IGxhYmVsSGlzdC5tYXAoKHZhbHVlLCBpbmRleCkgPT4gKHsgdmFsdWUsIGluZGV4IH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB2YWx1ZSA+PSA1KS5zb3J0KChhLCBiKSA9PiBiLnZhbHVlIC0gYS52YWx1ZSkubWFwKCh7IGluZGV4IH0pID0+IGluZGV4ICsgMSk7XG5cbiAgICAgICAgcmV0dXJuIHRvcExhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRCb3hlcyh0b3BMYWJlbHM6IEFycmF5PG51bWJlcj4sIG1heExhYmVsOiBudW1iZXIpOiBBcnJheTxCb3g+IHtcbiAgICAgICAgY29uc3QgYm94ZXMgPSBuZXcgQXJyYXk8Qm94PigpO1xuICAgICAgICBjb25zdCBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuZGVidWcgJiYgdGhpcy5fY29uZmlnLmRlYnVnLnNob3dSZW1haW5pbmdQYXRjaExhYmVscztcblxuICAgICAgICB0b3BMYWJlbHMuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRjaGVzID0gbmV3IEFycmF5PFBhdGNoPigpO1xuXG4gICAgICAgICAgICB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmZvckVhY2goKGRhdGE6IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2godGhpcy5faW1hZ2VUb1BhdGNoR3JpZFtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBib3ggPSB0aGlzLl9ib3hGcm9tUGF0Y2hlcyhwYXRjaGVzKTtcblxuICAgICAgICAgICAgaWYgKGJveCkge1xuICAgICAgICAgICAgICAgIGJveGVzLnB1c2goYm94KTtcblxuICAgICAgICAgICAgICAgIGlmIChzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhzdjogSFNWID0gWyhsYWJlbCAvIChtYXhMYWJlbCArIDEpKSAqIDM2MCwgMSwgMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJnYjogUkdCID0gWzAsIDAsIDBdO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IGByZ2IoJHtyZ2Iuam9pbignLCcpfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoZXMuZm9yRWFjaCgoeyBwb3MgfSkgPT4gdGhpcy5fZHJhd1JlY3QocG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgY29sb3IsIDIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHNpbWlsYXIgbW9tZW50cyAodmlhIGNsdXN0ZXIpXG4gICAgICogQHBhcmFtIG1vbWVudHNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaW1pbGFyTW9tZW50cyhtb21lbnRzOiBBcnJheTxNb21lbnQ+KTogQXJyYXk8TW9tZW50PiB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gQ2x1c3Rlci5jbHVzdGVyaXplKG1vbWVudHMsIE1vbWVudFNpbWlsYXJpdHlUaHJlc2hvbGQpO1xuICAgICAgICBjb25zdCB0b3BDbHVzdGVyID0gY2x1c3RlcnMucmVkdWNlKCh0b3AsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5tb21lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBjb3VudCA+IHRvcC5jb3VudCA/IHsgaXRlbSwgY291bnQgfSA6IHRvcDtcbiAgICAgICAgfSwgeyBpdGVtOiB7IG1vbWVudHM6IFtdIH0sIGNvdW50OiAwIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0b3BDbHVzdGVyLml0ZW0ubW9tZW50cztcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NrZWxldG9uaXplKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zdWJJbWFnZUFzQ29weSh0aGlzLl9zdWJJbWFnZVdyYXBwZXIsIHgsIHkpO1xuICAgICAgICB0aGlzLl9za2VsZXRvbml6ZXIuc2tlbGV0b25pemUoKTtcblxuICAgICAgICAvLyBTaG93IHNrZWxldG9uIGlmIHJlcXVlc3RlZFxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWcgJiYgdGhpcy5fY29uZmlnLmRlYnVnLnNob3dTa2VsZXRvbikge1xuICAgICAgICAgICAgdGhpcy5fc2tlbEltYWdlV3JhcHBlci5vdmVybGF5KHRoaXMuX2JpbmFyeUNvbnRleHQsIDM2MCwgeCwgeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhbmQgZGVzY3JpYmVzIHRob3NlIHBhdGNoZXMgd2hpY2ggc2VlbSB0byBjb250YWluIGEgYmFyY29kZSBwYXR0ZXJuXG4gICAgICogQHBhcmFtIG1vbWVudHNcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcGFyYW0geFxuICAgICAqIEBwYXJhbSB5XG4gICAgICogQHJldHVybnMgbGlzdCBvZiBwYXRjaGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVzY3JpYmVQYXRjaChtb21lbnRzOiBBcnJheTxNb21lbnQ+LCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IFBhdGNoIHtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgbWluQ29tcG9uZW50V2VpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX3BhdGNoU2l6ZS54IC8gMyk7XG4gICAgICAgICAgICAvLyBvbmx5IGNvbGxlY3QgbW9tZW50cyB3aGljaCBhcmVhIGNvdmVycyBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHQgcGl4ZWxzXG4gICAgICAgICAgICBjb25zdCBlbGlnaWJsZU1vbWVudHMgPSBtb21lbnRzLmZpbHRlcihtb21lbnQgPT4gbW9tZW50Lm0wMCA+IG1pbkNvbXBvbmVudFdlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIGlmIGF0IGxlYXN0IDIgbW9tZW50cyBhcmUgZm91bmQgd2hpY2ggaGF2ZSBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHRzIGNvdmVyZWRcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZU1vbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nTW9tZW50cyA9IHRoaXMuX3NpbWlsYXJNb21lbnRzKGVsaWdpYmxlTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbWF0Y2hpbmdNb21lbnRzLmxlbmd0aCB8IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IHR3byBvZiB0aGUgbW9tZW50cyBhcmUgYWxsb3dlZCBub3QgdG8gZml0IGludG8gdGhlIGVxdWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgKGxlbmd0aCA8PCAyKSA+PSBlbGlnaWJsZU1vbWVudHMubGVuZ3RoICogMyAmJiAobGVuZ3RoIDw8IDIpID4gbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBzaW1pbGFyaXR5IG9mIHRoZSBtb21lbnRzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZCA9IG1hdGNoaW5nTW9tZW50cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBtb21lbnQ6IE1vbWVudCkgPT4gc3VtICsgbW9tZW50LnJhZCwgMCkgLyBsZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiB7IHgsIHkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeCwgeSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeDogeCArIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLngsIHkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHg6IHggKyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54LCB5OiB5ICsgdGhpcy5fc3ViSW1hZ2VXcmFwcGVyLnNpemUueSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeCwgeTogeSArIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLnkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudHM6IG1hdGNoaW5nTW9tZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IE1hdGguY29zKHJhZCksXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnNpbihyYWQpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbm90WWV0UHJvY2Vzc2VkKCk6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaV0gPT09IDAgJiYgdGhpcy5fcGF0Y2hHcmlkLmRhdGFbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdHJhY2UoY3VycmVudEluZGV4OiBudW1iZXIsIGxhYmVsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMC45NTtcbiAgICAgICAgY29uc3QgY3VycmVudDogUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBjdXJyZW50SW5kZXggJSB0aGlzLl9wYXRjaExhYmVsR3JpZC5zaXplLngsXG4gICAgICAgICAgICB5OiAoY3VycmVudEluZGV4IC8gdGhpcy5fcGF0Y2hMYWJlbEdyaWQuc2l6ZS54KSB8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRjaCA9IHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIC8vIGFzc2lnbiBsYWJlbFxuICAgICAgICAgICAgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtjdXJyZW50SW5kZXhdID0gbGFiZWw7XG5cbiAgICAgICAgICAgIFNlYXJjaERpcmVjdGlvbnMuZm9yRWFjaChkaXJlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjdXJyZW50LnkgKyBkaXJlY3Rpb25bMF07XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IGN1cnJlbnQueCArIGRpcmVjdGlvblsxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHkgKiB0aGlzLl9wYXRjaExhYmVsR3JpZC5zaXplLnggKyB4O1xuXG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgaWYgcGF0Y2ggZW1wdHlcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGF0Y2hHcmlkLmRhdGFbaW5kZXhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaW5kZXhdID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaW5kZXhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gdGhpcy5faW1hZ2VUb1BhdGNoR3JpZFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSBNYXRoLmFicyhwYXRjaC54ICogY3VycmVudFBhdGNoLnggKyBwYXRjaC55ICogY3VycmVudFBhdGNoLnkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2UoaW5kZXgsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgcGF0Y2hlcyB3aGljaCBhcmUgY29ubmVjdGVkIGFuZCBzaGFyZSB0aGUgc2FtZSBvcmllbnRhdGlvblxuICAgICAqIEBwYXJhbSBwYXRjaGVzRm91bmRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yYXN0ZXJpemVBbmd1bGFyU2ltaWxhcml0eShwYXRjaGVzRm91bmQ6IEFycmF5PFBhdGNoPik6IG51bWJlciB7XG4gICAgICAgIGxldCBsYWJlbCA9IDA7XG4gICAgICAgIGNvbnN0IGhzdjogSFNWID0gWzAsIDEsIDFdO1xuICAgICAgICBjb25zdCByZ2I6IFJHQiA9IFswLCAwLCAwXTtcblxuICAgICAgICAvLyBwcmVwYXJlIGZvciBmaW5kaW5nIHRoZSByaWdodCBwYXRjaGVzXG4gICAgICAgIHRoaXMuX3BhdGNoR3JpZC5kYXRhLmZpbGwoMCk7XG4gICAgICAgIHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGEuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5faW1hZ2VUb1BhdGNoR3JpZC5maWxsKG51bGwpO1xuXG4gICAgICAgIHBhdGNoZXNGb3VuZC5mb3JFYWNoKHBhdGNoID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbcGF0Y2guaW5kZXhdID0gcGF0Y2g7XG4gICAgICAgICAgICB0aGlzLl9wYXRjaEdyaWQuZGF0YVtwYXRjaC5pbmRleF0gPSAxO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyByYXN0ZXJpemUgdGhlIHBhdGNoZXMgZm91bmQgdG8gZGV0ZXJtaW5lIGFyZWFcbiAgICAgICAgdGhpcy5fcGF0Y2hHcmlkLnplcm9Cb3JkZXIoKTtcblxuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKChjdXJyZW50SW5kZXggPSB0aGlzLl9ub3RZZXRQcm9jZXNzZWQoKSkgPCB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbGFiZWwrKztcbiAgICAgICAgICAgIHRoaXMuX3RyYWNlKGN1cnJlbnRJbmRleCwgbGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZyAmJiB0aGlzLl9jb25maWcuZGVidWcuc2hvd1BhdGNoTGFiZWxzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA+IDAgJiYgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA8PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRjaCA9IHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbal07XG4gICAgICAgICAgICAgICAgICAgIGhzdlswXSA9ICh0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhW2pdIC8gKGxhYmVsICsgMSkpICogMzYwO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1JlY3QocGF0Y2gucG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgYHJnYigke3JnYi5qb2luKCcsJyl9KWAsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kcmF3UmVjdCh7IHgsIHkgfTogUG9pbnQsIHNpemU6IFBvaW50LCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9iaW5hcnlDb250ZXh0LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoIHx8IDE7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQuc3Ryb2tlUmVjdCh4LCB5LCBzaXplLngsIHNpemUueSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhd1BhdGgocGF0aDogQXJyYXk8UG9pbnQ+LCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKHBhdGgsIHRoaXMuX2JpbmFyeUNvbnRleHQsIGNvbG9yLCBsaW5lV2lkdGgpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogQGJvcnJvd3MgaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vVGlwcy80MDcxNzIvQ29ubmVjdGVkLUNvbXBvbmVudC1MYWJlbGluZy1hbmQtVmVjdG9yaXphdGlvblxuICovXG5cbmltcG9ydCB7IEltYWdlV3JhcHBlciB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS13cmFwcGVyJztcbmltcG9ydCB7IENvbnRvdXJWZXJ0ZXgsIFRyYWNlciB9IGZyb20gJy4vdHJhY2VyJztcblxuZW51bSBFZGdlTGFiZWwge1xuICAgIE91dHNpZGUgPSAtMzI3NjcsXG4gICAgSW5zaWRlID0gLTMyNzY2XG59O1xuXG5lbnVtIENvbnRvdXJEaXJlY3Rpb24ge1xuICAgIENXID0gMCxcbiAgICBDQ1cgPSAxLFxuICAgIFVua25vd24gPSAyXG59O1xuXG5pbnRlcmZhY2UgQ29udG91ciB7XG4gICAgZGlyOiBDb250b3VyRGlyZWN0aW9uO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgZmlyc3RWZXJ0ZXg6IENvbnRvdXJWZXJ0ZXg7XG4gICAgcHJldmlvdXNQZWVyPzogQ29udG91cjtcbiAgICBuZXh0UGVlcj86IENvbnRvdXI7XG4gICAgaW5zaWRlQ29udG91cnM6IENvbnRvdXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFzdGVyUmVzdWx0IHtcbiAgICBjYzogQ29udG91cjtcbiAgICBjb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmFzdGVyaXplciB7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF90cmFjZXI6IFRyYWNlcjtcbiAgICBwcml2YXRlIF9pbWFnZURhdGE6IFVpbnQ4QXJyYXk7XG4gICAgcHJpdmF0ZSBfbGFiZWxEYXRhOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI8VWludDhBcnJheT4sIGxhYmVsV3JhcHBlcjogSW1hZ2VXcmFwcGVyPEFycmF5PG51bWJlcj4+KSB7XG4gICAgICAgIHRoaXMuX2ltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgICAgICB0aGlzLl9sYWJlbERhdGEgPSBsYWJlbFdyYXBwZXIuZGF0YSBhcyBBcnJheTxudW1iZXI+O1xuICAgICAgICB0aGlzLl93aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgICAgIHRoaXMuX3RyYWNlciA9IG5ldyBUcmFjZXIoaW1hZ2VXcmFwcGVyLCBsYWJlbFdyYXBwZXIpO1xuICAgIH1cblxuICAgIHJhc3Rlcml6ZShkZXB0aExhYmVsOiBudW1iZXIpOiBSYXN0ZXJSZXN1bHQge1xuICAgICAgICBjb25zdCBjb2xvck1hcCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MDA7IGkrKykge1xuICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29sb3JNYXBbMF0gPSB0aGlzLl9pbWFnZURhdGFbMF07XG5cbiAgICAgICAgbGV0IGNjOiBDb250b3VyID0gbnVsbDtcbiAgICAgICAgbGV0IHNjOiBDb250b3VyO1xuICAgICAgICBsZXQgY29ubmVjdGVkQ291bnQgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGN5ID0gMTsgY3kgPCB0aGlzLl9oZWlnaHQgLSAxOyBjeSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgYmMgPSBjb2xvck1hcFswXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY3ggPSAxOyBjeCA8IHRoaXMuX3dpZHRoIC0gMTsgY3grKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IGN5ICogdGhpcy5fd2lkdGggKyBjeDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sYWJlbERhdGFbcG9zXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuX2ltYWdlRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IgIT09IGJjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxjID0gY29ubmVjdGVkQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2xjXSA9IGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gdGhpcy5fdHJhY2VyLmNvbnRvdXJUcmFjaW5nKGN5LCBjeCwgbGMsIGNvbG9yLCBFZGdlTGFiZWwuT3V0c2lkZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEluZGV4ID0gbGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHA6IENvbnRvdXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI6IENvbnRvdXJEaXJlY3Rpb24uQ1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbGFiZWxJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVlcjogY2MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVDb250b3VyczogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLnByZXZpb3VzUGVlciA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gdGhpcy5fdHJhY2VyLmNvbnRvdXJUcmFjaW5nKGN5LCBjeCwgRWRnZUxhYmVsLkluc2lkZSwgY29sb3IsIGxhYmVsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcDogQ29udG91ciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogZGVwdGhMYWJlbCA9PT0gMCA/IENvbnRvdXJEaXJlY3Rpb24uQ0NXIDogQ29udG91ckRpcmVjdGlvbi5DVyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogZGVwdGhMYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZUNvbnRvdXJzOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjID0gY2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoc2MgIT09IG51bGwpICYmIHNjLmluZGV4ICE9PSBsYWJlbEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IHNjLm5leHRQZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0UGVlciA9IHNjLmluc2lkZUNvbnRvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjLmluc2lkZUNvbnRvdXJzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MuaW5zaWRlQ29udG91cnMucHJldmlvdXNQZWVyID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLmluc2lkZUNvbnRvdXJzID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsRGF0YVtwb3NdID0gbGFiZWxJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFiZWxEYXRhW3Bvc10gPT09IEVkZ2VMYWJlbC5JbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJjID0gdGhpcy5faW1hZ2VEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9sYWJlbERhdGFbcG9zXSA9PT0gRWRnZUxhYmVsLk91dHNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3JNYXBbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxJbmRleCA9IHRoaXMuX2xhYmVsRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwW2xhYmVsSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNjID0gY2M7XG4gICAgICAgIHdoaWxlIChzYyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2MuaW5kZXggPSBkZXB0aExhYmVsO1xuICAgICAgICAgICAgc2MgPSBzYy5uZXh0UGVlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYyxcbiAgICAgICAgICAgIGNvdW50OiBjb25uZWN0ZWRDb3VudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGRyYXdDb250b3VyKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGZpcnN0Q29udG91cjogQ29udG91cik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZWQnO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZWQnO1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG5cbiAgICAgICAgbGV0IHBxID0gZmlyc3RDb250b3VyO1xuICAgICAgICBsZXQgaXEgPSBwcSAmJiBwcS5pbnNpZGVDb250b3VycztcblxuICAgICAgICB3aGlsZSAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBxID0gaXEgfHwgcHE7XG5cbiAgICAgICAgICAgIGlmIChpcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlxID0gaXEubmV4dFBlZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBxID0gcHEubmV4dFBlZXI7XG4gICAgICAgICAgICAgICAgaXEgPSBwcSAmJiBwcS5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChxLmRpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgQ29udG91ckRpcmVjdGlvbi5DVzoge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIENvbnRvdXJEaXJlY3Rpb24uQ0NXOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIENvbnRvdXJEaXJlY3Rpb24uVW5rbm93bjoge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcCA9IHEuZmlyc3RWZXJ0ZXg7XG4gICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8ocC54LCBwLnkpO1xuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwLngsIHAueSk7XG4gICAgICAgICAgICB9IHdoaWxlIChwICE9PSBxLmZpcnN0VmVydGV4KTtcblxuICAgICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuZnVuY3Rpb24gU2tlbGV0b25pemVyKHN0ZGxpYiwgZm9yZWlnbiwgYnVmZmVyKSB7XG4gICAgXCJ1c2UgYXNtXCI7XG5cbiAgICB2YXIgaW1hZ2VzID0gbmV3IHN0ZGxpYi5VaW50OEFycmF5KGJ1ZmZlciksXG4gICAgICAgIHNpemUgPSBmb3JlaWduLnNpemUgfCAwLFxuICAgICAgICBpbXVsID0gc3RkbGliLk1hdGguaW11bDtcblxuICAgIGZ1bmN0aW9uIGVyb2RlKGluSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGluSW1hZ2VQdHIgPSBpbkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHYgPSAwLFxuICAgICAgICAgICAgdSA9IDAsXG4gICAgICAgICAgICBzdW0gPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MSA9IDAsXG4gICAgICAgICAgICB5U3RhcnQyID0gMCxcbiAgICAgICAgICAgIHhTdGFydDEgPSAwLFxuICAgICAgICAgICAgeFN0YXJ0MiA9IDAsXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZvciAodiA9IDE7ICh2IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB2ID0gKHYgKyAxKSB8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICBmb3IgKHUgPSAxOyAodSB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdSA9ICh1ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MSA9IChvZmZzZXQgLSBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MiA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MSA9ICh1IC0gMSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDIgPSAodSArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICBzdW0gPSAoKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDIpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MikgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKChzdW0gfCAwKSA9PSAoNSB8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJ0cmFjdChhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyID0gYUltYWdlUHRyIHwgMDtcbiAgICAgICAgYkltYWdlUHRyID0gYkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID1cbiAgICAgICAgICAgICAgICAoKGltYWdlc1soYUltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkgLSAoaW1hZ2VzWyhiSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYml0d2lzZU9yKGFJbWFnZVB0ciwgYkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBhSW1hZ2VQdHIgPSBhSW1hZ2VQdHIgfCAwO1xuICAgICAgICBiSW1hZ2VQdHIgPSBiSW1hZ2VQdHIgfCAwO1xuICAgICAgICBvdXRJbWFnZVB0ciA9IG91dEltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPVxuICAgICAgICAgICAgICAgICgoaW1hZ2VzWyhhSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSB8IChpbWFnZXNbKGJJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb3VudE5vblplcm8oaW1hZ2VQdHIpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHN1bSA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgc3VtID0gKChzdW0gfCAwKSArIChpbWFnZXNbKGltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoc3VtIHwgMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdChpbWFnZVB0ciwgdmFsdWUpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGluSW1hZ2VQdHIgPSBpbkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHYgPSAwLFxuICAgICAgICAgICAgdSA9IDAsXG4gICAgICAgICAgICBzdW0gPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MSA9IDAsXG4gICAgICAgICAgICB5U3RhcnQyID0gMCxcbiAgICAgICAgICAgIHhTdGFydDEgPSAwLFxuICAgICAgICAgICAgeFN0YXJ0MiA9IDAsXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZvciAodiA9IDE7ICh2IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB2ID0gKHYgKyAxKSB8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICBmb3IgKHUgPSAxOyAodSB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdSA9ICh1ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MSA9IChvZmZzZXQgLSBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MiA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MSA9ICh1IC0gMSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDIgPSAodSArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICBzdW0gPSAoKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDIpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MikgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKChzdW0gfCAwKSA+ICgwIHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lbWNweShzcmNJbWFnZVB0ciwgZHN0SW1hZ2VQdHIpIHtcbiAgICAgICAgc3JjSW1hZ2VQdHIgPSBzcmNJbWFnZVB0ciB8IDA7XG4gICAgICAgIGRzdEltYWdlUHRyID0gZHN0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhkc3RJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9IChpbWFnZXNbKHNyY0ltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvQm9yZGVyKGltYWdlUHRyKSB7XG4gICAgICAgIGltYWdlUHRyID0gaW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB4ID0gMCxcbiAgICAgICAgICAgIHkgPSAwO1xuXG4gICAgICAgIGZvciAoeCA9IDA7ICh4IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB4ID0gKHggKyAxKSB8IDApIHtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB4KSB8IDBdID0gMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB5KSB8IDBdID0gMDtcbiAgICAgICAgICAgIHkgPSAoKHkgKyBzaXplKSAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB5KSB8IDBdID0gMDtcbiAgICAgICAgICAgIHkgPSAoeSArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHggPSAwOyAoeCB8IDApIDwgKHNpemUgfCAwKTsgeCA9ICh4ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKHkgKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBza2VsZXRvbml6ZSgpIHtcbiAgICAgICAgdmFyIHN1YkltYWdlUHRyID0gMCxcbiAgICAgICAgICAgIGVyb2RlZEltYWdlUHRyID0gMCxcbiAgICAgICAgICAgIHRlbXBJbWFnZVB0ciA9IDAsXG4gICAgICAgICAgICBza2VsSW1hZ2VQdHIgPSAwLFxuICAgICAgICAgICAgc3VtID0gMCxcbiAgICAgICAgICAgIGRvbmUgPSAwO1xuXG4gICAgICAgIGVyb2RlZEltYWdlUHRyID0gaW11bChzaXplLCBzaXplKSB8IDA7XG4gICAgICAgIHRlbXBJbWFnZVB0ciA9IChlcm9kZWRJbWFnZVB0ciArIGVyb2RlZEltYWdlUHRyKSB8IDA7XG4gICAgICAgIHNrZWxJbWFnZVB0ciA9ICh0ZW1wSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwO1xuXG4gICAgICAgIC8vIGluaXQgc2tlbC1pbWFnZVxuICAgICAgICBpbml0KHNrZWxJbWFnZVB0ciwgMCk7XG4gICAgICAgIHplcm9Cb3JkZXIoc3ViSW1hZ2VQdHIpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVyb2RlKHN1YkltYWdlUHRyLCBlcm9kZWRJbWFnZVB0cik7XG4gICAgICAgICAgICBkaWxhdGUoZXJvZGVkSW1hZ2VQdHIsIHRlbXBJbWFnZVB0cik7XG4gICAgICAgICAgICBzdWJ0cmFjdChzdWJJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgYml0d2lzZU9yKHNrZWxJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCBza2VsSW1hZ2VQdHIpO1xuICAgICAgICAgICAgbWVtY3B5KGVyb2RlZEltYWdlUHRyLCBzdWJJbWFnZVB0cik7XG4gICAgICAgICAgICBzdW0gPSBjb3VudE5vblplcm8oc3ViSW1hZ2VQdHIpIHwgMDtcbiAgICAgICAgICAgIGRvbmUgPSAoKHN1bSB8IDApID09IDAgfCAwKTtcbiAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHNrZWxldG9uaXplOiBza2VsZXRvbml6ZVxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbml6ZXI7XG4vKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuIiwiaW1wb3J0IHsgSW1hZ2VXcmFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9pbWFnZS13cmFwcGVyXCI7XG5cbi8qKlxuICogQGJvcnJvd3MgaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vVGlwcy80MDcxNzIvQ29ubmVjdGVkLUNvbXBvbmVudC1MYWJlbGluZy1hbmQtVmVjdG9yaXphdGlvblxuICovXG5cbnR5cGUgRGlyZWN0aW9uID0gbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgU2VhcmNoRGlyZWN0aW9uczogQXJyYXk8QXJyYXk8RGlyZWN0aW9uPj4gPSBbWzAsIDFdLCBbMSwgMV0sIFsxLCAwXSwgWzEsIC0xXSwgWzAsIC0xXSwgWy0xLCAtMV0sIFstMSwgMF0sIFstMSwgMV1dO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRvdXJWZXJ0ZXgge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgZGlyOiBEaXJlY3Rpb24sXG4gICAgbmV4dDogQ29udG91clZlcnRleCxcbiAgICBwcmV2OiBDb250b3VyVmVydGV4XG59XG5cbmludGVyZmFjZSBDdXJyZW50IHtcbiAgICBjeDogbnVtYmVyLFxuICAgIGN5OiBudW1iZXIsXG4gICAgZGlyOiBEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNlciB7XG4gICAgcHJpdmF0ZSBfaW1hZ2VEYXRhOiBVaW50OEFycmF5O1xuICAgIHByaXZhdGUgX2xhYmVsRGF0YTogQXJyYXk8bnVtYmVyPjtcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGxhYmVsV3JhcHBlcjogSW1hZ2VXcmFwcGVyPEFycmF5PG51bWJlcj4+KSB7XG4gICAgICAgIHRoaXMuX2ltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgICAgICB0aGlzLl9sYWJlbERhdGEgPSBsYWJlbFdyYXBwZXIuZGF0YSBhcyBBcnJheTxudW1iZXI+O1xuICAgICAgICB0aGlzLl93aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgfVxuXG4gICAgdHJhY2UoY3VycmVudDogQ3VycmVudCwgY29sb3I6IG51bWJlciwgbGFiZWw6IG51bWJlciwgZWRnZUxhYmVsOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjdXJyZW50LmN5ICsgU2VhcmNoRGlyZWN0aW9uc1tjdXJyZW50LmRpcl1bMF0gfCAwO1xuICAgICAgICAgICAgY29uc3QgeCA9IGN1cnJlbnQuY3ggKyBTZWFyY2hEaXJlY3Rpb25zW2N1cnJlbnQuZGlyXVsxXSB8IDA7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSB5ICogdGhpcy5fd2lkdGggKyB4IHwgMDtcblxuICAgICAgICAgICAgaWYgKCh0aGlzLl9pbWFnZURhdGFbcG9zXSA9PT0gY29sb3IpICYmICgodGhpcy5fbGFiZWxEYXRhW3Bvc10gPT09IDApIHx8ICh0aGlzLl9sYWJlbERhdGFbcG9zXSA9PT0gbGFiZWwpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsRGF0YVtwb3NdID0gbGFiZWw7XG4gICAgICAgICAgICAgICAgY3VycmVudC5jeCA9IHg7XG4gICAgICAgICAgICAgICAgY3VycmVudC5jeSA9IHk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsRGF0YVtwb3NdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsRGF0YVtwb3NdID0gZWRnZUxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50LmRpciA9IChjdXJyZW50LmRpciArIDEpICUgODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb250b3VyVHJhY2luZyhzeTogbnVtYmVyLCBzeDogbnVtYmVyLCBsYWJlbDogbnVtYmVyLCBjb2xvcjogbnVtYmVyLCBlZGdlTGFiZWw6IG51bWJlcik6IENvbnRvdXJWZXJ0ZXgge1xuICAgICAgICBsZXQgRnY6IENvbnRvdXJWZXJ0ZXggPSBudWxsO1xuICAgICAgICBjb25zdCBjdXJyZW50OiBDdXJyZW50ID0ge1xuICAgICAgICAgICAgY3g6IHN4LFxuICAgICAgICAgICAgY3k6IHN5LFxuICAgICAgICAgICAgZGlyOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMudHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlTGFiZWwpKSB7XG4gICAgICAgICAgICBGdiA9IHtcbiAgICAgICAgICAgICAgICB4OiBzeCxcbiAgICAgICAgICAgICAgICB5OiBzeSxcbiAgICAgICAgICAgICAgICBkaXI6IGN1cnJlbnQuZGlyLFxuICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcHJldjogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBDdiA9IEZ2O1xuICAgICAgICAgICAgbGV0IGxkaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgIGxldCBQID0ge1xuICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQuY3gsXG4gICAgICAgICAgICAgICAgeTogY3VycmVudC5jeSxcbiAgICAgICAgICAgICAgICBkaXI6IDAsXG4gICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICBwcmV2OiBDdlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIEN2Lm5leHQgPSBQO1xuICAgICAgICAgICAgQ3YgPSBQO1xuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5kaXIgPSAoY3VycmVudC5kaXIgKyA2KSAlIDg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZUxhYmVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChsZGlyICE9PSBjdXJyZW50LmRpcikge1xuICAgICAgICAgICAgICAgICAgICBDdi5kaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgICAgICAgICAgUCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQuY3gsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBjdXJyZW50LmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXY6IEN2XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIEN2Lm5leHQgPSBQO1xuICAgICAgICAgICAgICAgICAgICBDdiA9IFA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQ3YuZGlyID0gbGRpcjtcbiAgICAgICAgICAgICAgICAgICAgQ3YueCA9IGN1cnJlbnQuY3g7XG4gICAgICAgICAgICAgICAgICAgIEN2LnkgPSBjdXJyZW50LmN5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxkaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgIH0gd2hpbGUgKGN1cnJlbnQuY3ggIT09IHN4IHx8IGN1cnJlbnQuY3kgIT09IHN5KTtcblxuICAgICAgICAgICAgRnYucHJldiA9IEN2LnByZXY7XG4gICAgICAgICAgICBDdi5wcmV2Lm5leHQgPSBGdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRnY7XG4gICAgfVxufVxuIiwiaW1wb3J0IF9wb2x5ZmlsbHMgZnJvbSAnLi9jb21tb24vcG9seWZpbGxzJztcbmltcG9ydCB7IFJlc3VsdENvbGxlY3RvciB9IGZyb20gJy4vYW5hbHl0aWNzL3Jlc3VsdC1jb2xsZWN0b3InO1xuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi9jb21tb24vYm94JztcbmltcG9ydCB7IEV2ZW50Q2FsbGJhY2ssIEV2ZW50cywgRXZlbnRTdWJzY3JpcHRpb24gfSBmcm9tICcuL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgSW1hZ2VEZWJ1ZyB9IGZyb20gJy4vY29tbW9uL2ltYWdlLWRlYnVnJztcbmltcG9ydCB7IEltYWdlV3JhcHBlciB9IGZyb20gJy4vY29tbW9uL2ltYWdlLXdyYXBwZXInO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuL2NvbW1vbi9tZXJnZSc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IGNvbmZpZyBhcyBkZWZhdWx0Q29uZmlnLCBRdWFnZ2FDb25maWcgfSBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xuaW1wb3J0IHsgQmFyY29kZURlY29kZXIsIFF1YWdnYUJhcmNvZGUgfSBmcm9tICcuL2RlY29kZXIvYmFyY29kZS1kZWNvZGVyJztcbmltcG9ydCB7IENhbWVyYUFjY2VzcyB9IGZyb20gJy4vaW5wdXQvY2FtZXJhLWFjY2Vzcyc7XG5pbXBvcnQgeyBGcmFtZUdyYWJiZXIgfSBmcm9tICcuL2lucHV0L2ZyYW1lLWdyYWJiZXInO1xuaW1wb3J0IHsgSW1hZ2VTdHJlYW0gfSBmcm9tICcuL2lucHV0L2ltYWdlLXN0cmVhbSc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbSB9IGZyb20gJy4vaW5wdXQvaW5wdXQtc3RyZWFtJztcbmltcG9ydCB7IExpdmVTdHJlYW0gfSBmcm9tICcuL2lucHV0L2xpdmUtc3RyZWFtJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtIH0gZnJvbSAnLi9pbnB1dC92aWRlby1zdHJlYW0nO1xuaW1wb3J0IHsgY2hlY2tJbWFnZUNvbnN0cmFpbnRzIH0gZnJvbSAnLi9pbnB1dC9pbnB1dC1zdHJlYW0tdXRpbHMnO1xuaW1wb3J0IHsgQmFyY29kZUxvY2F0b3IgfSBmcm9tICcuL2xvY2F0b3IvYmFyY29kZS1sb2NhdG9yJztcbmltcG9ydCB7IEJhcmNvZGVSZWFkZXJEZWNsYXJhdGlvbiB9IGZyb20gJy4vcmVhZGVyL2JhcmNvZGUtcmVhZGVyJztcblxuaW50ZXJmYWNlIFdvcmtlclRocmVhZCB7XG4gICAgd29ya2VyOiBXb3JrZXI7XG4gICAgaW1hZ2VEYXRhOiBVaW50OEFycmF5O1xuICAgIGJ1c3k6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVhZ2dhQ2FudmFzQ29udGFpbmVyIHtcbiAgICBjdHg6IHtcbiAgICAgICAgaW1hZ2U6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgICAgICAgb3ZlcmxheTogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgaW1hZ2U6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgICAgICBvdmVybGF5OiBIVE1MQ2FudmFzRWxlbWVudFxuICAgIH1cbn1cblxubGV0IF9pbnB1dFN0cmVhbTogSW5wdXRTdHJlYW07XG5sZXQgX2ZyYW1lR3JhYmJlcjogRnJhbWVHcmFiYmVyO1xubGV0IF9zdG9wcGVkOiBib29sZWFuO1xuY29uc3QgX2NhbnZhc0NvbnRhaW5lcjogUXVhZ2dhQ2FudmFzQ29udGFpbmVyID0ge1xuICAgIGN0eDoge1xuICAgICAgICBpbWFnZTogbnVsbCxcbiAgICAgICAgb3ZlcmxheTogbnVsbFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGltYWdlOiBudWxsLFxuICAgICAgICBvdmVybGF5OiBudWxsXG4gICAgfVxufTtcbmxldCBfaW5wdXRJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcbmxldCBfbG9jYXRvcjogQmFyY29kZUxvY2F0b3I7XG5sZXQgX2JveFNpemU6IEJveDtcbmxldCBfZGVjb2RlcjogQmFyY29kZURlY29kZXI7XG5sZXQgX3dvcmtlclBvb2wgPSBuZXcgQXJyYXk8V29ya2VyVGhyZWFkPigpO1xubGV0IF9vblVJVGhyZWFkOiBib29sZWFuO1xubGV0IF9yZXN1bHRDb2xsZWN0b3I6IFJlc3VsdENvbGxlY3RvcjtcbmxldCBfY29uZmlnOiBRdWFnZ2FDb25maWc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0KGNvbmZpZzogUXVhZ2dhQ29uZmlnLCBjYjogKCkgPT4gdm9pZCwgaW1hZ2VXcmFwcGVyPzogSW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIF9vblVJVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgX2NvbmZpZyA9IG1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgIGlmIChpbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgICAgIF9vblVJVGhyZWFkID0gZmFsc2U7XG4gICAgICAgICAgICBfaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaW5pdElucHV0U3RyZWFtKGNiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBDYW1lcmFBY2Nlc3M6IENhbWVyYUFjY2VzcyxcblxuICAgIEltYWdlRGVidWc6IEltYWdlRGVidWcsXG5cbiAgICBJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcixcblxuICAgIFJlc3VsdENvbGxlY3RvcjogUmVzdWx0Q29sbGVjdG9yLFxuXG4gICAgZ2V0IGNhbnZhcygpOiBRdWFnZ2FDYW52YXNDb250YWluZXIge1xuICAgICAgICByZXR1cm4gX2NhbnZhc0NvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgc3RhcnQoKTogdm9pZCB7XG4gICAgICAgIGlmIChfb25VSVRocmVhZCAmJiBfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgX3N0YXJ0Q29udGludW91c1VwZGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3VwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIF9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgX2FkanVzdFdvcmtlclBvb2woMCk7XG4gICAgICAgIGlmIChfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgQ2FtZXJhQWNjZXNzLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZWNvZGVTaW5nbGUoY29uZmlnOiBRdWFnZ2FDb25maWcsIHJlc3VsdENhbGxiYWNrOiAoXzogUXVhZ2dhQmFyY29kZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25maWcgPSBtZXJnZSh7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdJbWFnZVN0cmVhbScsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNpemU6IDgwMCxcbiAgICAgICAgICAgICAgICBzcmM6IGNvbmZpZy5zcmNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudW1PZldvcmtlcnM6IChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5kZWJ1ZykgPyAwIDogMSxcbiAgICAgICAgICAgIGxvY2F0b3I6IHtcbiAgICAgICAgICAgICAgICBoYWxmU2FtcGxlOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjb25maWcpO1xuXG4gICAgICAgIHRoaXMuaW5pdChjb25maWcsICgpID0+IHtcbiAgICAgICAgICAgIEV2ZW50cy5vbmNlKCdwcm9jZXNzZWQnLCAocmVzdWx0OiBRdWFnZ2FCYXJjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2suY2FsbChudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBwYXVzZSgpOiB2b2lkIHtcbiAgICAgICAgX3N0b3BwZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBvbkRldGVjdGVkKGNhbGxiYWNrOiBFdmVudFN1YnNjcmlwdGlvbiB8IEV2ZW50Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZSgnZGV0ZWN0ZWQnLCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIG9mZkRldGVjdGVkKGNhbGxiYWNrOiBFdmVudENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIEV2ZW50cy51bnN1YnNjcmliZSgnZGV0ZWN0ZWQnLCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIG9uUHJvY2Vzc2VkKGNhbGxiYWNrOiBFdmVudFN1YnNjcmlwdGlvbiB8IEV2ZW50Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZSgncHJvY2Vzc2VkJywgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICBvZmZQcm9jZXNzZWQoY2FsbGJhY2s6IEV2ZW50Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgRXZlbnRzLnVuc3Vic2NyaWJlKCdwcm9jZXNzZWQnLCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIHNldFJlYWRlcnMocmVhZGVyczogQXJyYXk8QmFyY29kZVJlYWRlckRlY2xhcmF0aW9uPik6IHZvaWQge1xuICAgICAgICBpZiAoX2RlY29kZXIpIHtcbiAgICAgICAgICAgIF9kZWNvZGVyLnNldFJlYWRlcnMocmVhZGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAoX29uVUlUaHJlYWQgJiYgX3dvcmtlclBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgX3dvcmtlclBvb2wuZm9yRWFjaCgoeyB3b3JrZXIgfSkgPT4gd29ya2VyLnBvc3RNZXNzYWdlKHsgY21kOiAnc2V0UmVhZGVycycsIHJlYWRlcnMgfSkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyUmVzdWx0Q29sbGVjdG9yKHJlc3VsdENvbGxlY3RvcjogUmVzdWx0Q29sbGVjdG9yKTogdm9pZCB7XG4gICAgICAgIGlmIChyZXN1bHRDb2xsZWN0b3IgJiYgdHlwZW9mIHJlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9yZXN1bHRDb2xsZWN0b3IgPSByZXN1bHRDb2xsZWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyPzogSW1hZ2VXcmFwcGVyKTogdm9pZCB7XG4gICAgX2luaXRCdWZmZXJzKGltYWdlV3JhcHBlcik7XG4gICAgX2RlY29kZXIgPSBuZXcgQmFyY29kZURlY29kZXIoX2NvbmZpZy5kZWNvZGVyLCBfaW5wdXRJbWFnZVdyYXBwZXIpO1xufVxuXG5mdW5jdGlvbiBfaW5pdElucHV0U3RyZWFtKGNhbGxiYWNrOiAoZXJyPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgbGV0IHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50O1xuICAgIGlmIChfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdWaWRlb1N0cmVhbScpIHtcbiAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICBfaW5wdXRTdHJlYW0gPSBuZXcgVmlkZW9TdHJlYW0odmlkZW8pO1xuICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnSW1hZ2VTdHJlYW0nKSB7XG4gICAgICAgIF9pbnB1dFN0cmVhbSA9IG5ldyBJbWFnZVN0cmVhbSgpO1xuICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBfZ2V0Vmlld1BvcnQoKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICB2aWRlbyA9IHZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7XG4gICAgICAgICAgICBpZiAoIXZpZGVvKSB7XG4gICAgICAgICAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfaW5wdXRTdHJlYW0gPSBuZXcgTGl2ZVN0cmVhbSh2aWRlbyk7XG4gICAgICAgIENhbWVyYUFjY2Vzcy5yZXF1ZXN0KHZpZGVvLCBfY29uZmlnLmlucHV0U3RyZWFtLmNvbnN0cmFpbnRzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gX2lucHV0U3RyZWFtLnRyaWdnZXIoJ2NhbnJlY29yZCcpLCBlcnIgPT4gY2FsbGJhY2soZXJyKSk7XG4gICAgfVxuXG4gICAgX2lucHV0U3RyZWFtLnNldEF0dHJpYnV0ZSgncHJlbG9hZCcsICdhdXRvJyk7XG4gICAgX2lucHV0U3RyZWFtLmNvbmZpZyA9IF9jb25maWcuaW5wdXRTdHJlYW07XG4gICAgX2lucHV0U3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnJlY29yZCcsIF9jYW5SZWNvcmQuYmluZCh0aGlzLCBjYWxsYmFjaykpO1xufVxuXG5mdW5jdGlvbiBfZ2V0Vmlld1BvcnQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRhcmdldCA9IF9jb25maWcuaW5wdXRTdHJlYW0udGFyZ2V0O1xuICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBhbHJlYWR5IGEgRE9NIGVsZW1lbnRcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgJyNpbnRlcmFjdGl2ZS52aWV3cG9ydCcgYXMgYSBmYWxsYmFjayBzZWxlY3RvciAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgPyB0YXJnZXQgOiAnI2ludGVyYWN0aXZlLnZpZXdwb3J0JztcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX2NhblJlY29yZChjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNoZWNrSW1hZ2VDb25zdHJhaW50cyhfaW5wdXRTdHJlYW0sIF9jb25maWcubG9jYXRvcik7XG4gICAgX2luaXRDYW52YXMoKTtcbiAgICBfZnJhbWVHcmFiYmVyID0gbmV3IEZyYW1lR3JhYmJlcihfaW5wdXRTdHJlYW0sIF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlKTtcblxuICAgIF9hZGp1c3RXb3JrZXJQb29sKF9jb25maWcubnVtT2ZXb3JrZXJzLCAoKSA9PiB7XG4gICAgICAgIGlmIChfY29uZmlnLm51bU9mV29ya2VycyA9PT0gMCkge1xuICAgICAgICAgICAgX2luaXRpYWxpemVEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBfaW5wdXRTdHJlYW0ucGxheSgpO1xuICAgICAgICBjYigpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfaW5pdENhbnZhcygpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IF9nZXRWaWV3UG9ydCgpO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5pbWdCdWZmZXInKTtcbiAgICAgICAgaWYgKCFfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSkge1xuICAgICAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlLmNsYXNzTmFtZSA9ICdpbWdCdWZmZXInO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0ICYmIF9jb25maWcuaW5wdXRTdHJlYW0udHlwZSA9PT0gJ0ltYWdlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmN0eC5pbWFnZSA9IF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlLndpZHRoID0gX2lucHV0U3RyZWFtLmNhbnZhc1dpZHRoO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5oZWlnaHQgPSBfaW5wdXRTdHJlYW0uY2FudmFzSGVpZ2h0O1xuXG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMuZHJhd2luZ0J1ZmZlcicpO1xuICAgICAgICBpZiAoIV9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkuY2xhc3NOYW1lID0gJ2RyYXdpbmdCdWZmZXInO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQoX2NhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGVhckZpeCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJyk7XG4gICAgICAgICAgICBjbGVhckZpeC5zZXRBdHRyaWJ1dGUoJ2NsZWFyJywgJ2FsbCcpO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQoY2xlYXJGaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuY3R4Lm92ZXJsYXkgPSBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5LmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkud2lkdGggPSBfaW5wdXRTdHJlYW0uY2FudmFzV2lkdGg7XG4gICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkuaGVpZ2h0ID0gX2lucHV0U3RyZWFtLmNhbnZhc0hlaWdodDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9pbml0QnVmZmVycyhpbWFnZVdyYXBwZXI/OiBJbWFnZVdyYXBwZXIpOiB2b2lkIHtcbiAgICBpZiAoaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIF9pbnB1dEltYWdlV3JhcHBlciA9IGltYWdlV3JhcHBlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfaW5wdXRJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgIHg6IF9pbnB1dFN0cmVhbS53aWR0aCxcbiAgICAgICAgICAgIHk6IF9pbnB1dFN0cmVhbS5oZWlnaHRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUpO1xuICAgIH1cbiAgICBfYm94U2l6ZSA9IFtcbiAgICAgICAgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueSB9LFxuICAgICAgICB7IHg6IF9pbnB1dEltYWdlV3JhcHBlci5zaXplLngsIHk6IF9pbnB1dEltYWdlV3JhcHBlci5zaXplLnkgfSxcbiAgICAgICAgeyB4OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54LCB5OiAwIH1cbiAgICBdO1xuICAgIF9sb2NhdG9yID0gbmV3IEJhcmNvZGVMb2NhdG9yKF9pbnB1dEltYWdlV3JhcHBlciwgX2NvbmZpZy5sb2NhdG9yKTtcbn1cblxuZnVuY3Rpb24gX3RyYW5zZm9ybShwb2x5Z29uOiBSZWFkb25seUFycmF5PFBvaW50Piwgb2Zmc2V0OiBQb2ludCk6IHZvaWQge1xuICAgIHBvbHlnb24uZm9yRWFjaCh2ZXJ0ZXggPT4ge1xuICAgICAgICB2ZXJ0ZXgueCArPSBvZmZzZXQueDtcbiAgICAgICAgdmVydGV4LnkgKz0gb2Zmc2V0Lnk7XG4gICAgfSlcbn1cblxuZnVuY3Rpb24gX3RyYW5zZm9ybVJlc3VsdChyZXN1bHQ6IFF1YWdnYUJhcmNvZGUsIG9mZnNldDogUG9pbnQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmJhcmNvZGVzKSB7XG4gICAgICAgIHJlc3VsdC5iYXJjb2Rlcy5mb3JFYWNoKGJhcmNvZGUgPT4gX3RyYW5zZm9ybVJlc3VsdChiYXJjb2RlLCBvZmZzZXQpKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmxpbmUpIHtcbiAgICAgICAgX3RyYW5zZm9ybShyZXN1bHQubGluZSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmJveCkge1xuICAgICAgICBfdHJhbnNmb3JtKHJlc3VsdC5ib3gsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5ib3hlcykge1xuICAgICAgICByZXN1bHQuYm94ZXMuZm9yRWFjaChib3ggPT4gX3RyYW5zZm9ybShib3gsIG9mZnNldCkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX2FkZFJlc3VsdChyZXN1bHQ6IFF1YWdnYUJhcmNvZGUsIGltYWdlRGF0YTogVWludDhBcnJheSwgY2FudmFzV2lkdGg6IG51bWJlciwgY2FudmFzSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaW1hZ2VEYXRhICYmIF9yZXN1bHRDb2xsZWN0b3IpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5iYXJjb2Rlcykge1xuICAgICAgICAgICAgcmVzdWx0LmJhcmNvZGVzLmZvckVhY2goKHsgY29kZVJlc3VsdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQoaW1hZ2VEYXRhLCBjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0LCBjb2RlUmVzdWx0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICBfcmVzdWx0Q29sbGVjdG9yLmFkZFJlc3VsdChpbWFnZURhdGEsIGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQsIHJlc3VsdC5jb2RlUmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gX2hhc0NvZGVSZXN1bHQocmVzdWx0OiBRdWFnZ2FCYXJjb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc3VsdCAmJiAoISFyZXN1bHQuY29kZVJlc3VsdCB8fCByZXN1bHQuYmFyY29kZXMgJiYgcmVzdWx0LmJhcmNvZGVzLnNvbWUoYmFyY29kZSA9PiAhIWJhcmNvZGUuY29kZVJlc3VsdCkpO1xufVxuXG5mdW5jdGlvbiBfcHVibGlzaFJlc3VsdChyZXN1bHQ/OiBRdWFnZ2FCYXJjb2RlLCBpbWFnZURhdGE/OiBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgbGV0IHJlc3VsdFRvUHVibGlzaDogUXVhZ2dhQmFyY29kZSB8IEFycmF5PFF1YWdnYUJhcmNvZGU+ID0gcmVzdWx0O1xuXG4gICAgaWYgKHJlc3VsdCAmJiBfb25VSVRocmVhZCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBfaW5wdXRTdHJlYW0udG9wTGVmdDtcblxuICAgICAgICBpZiAob2Zmc2V0LnggIT09IDAgfHwgb2Zmc2V0LnkgIT09IDApIHtcbiAgICAgICAgICAgIF90cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2FkZFJlc3VsdChyZXN1bHQsIGltYWdlRGF0YSwgX2lucHV0U3RyZWFtLmNhbnZhc1dpZHRoLCBfaW5wdXRTdHJlYW0uY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgcmVzdWx0VG9QdWJsaXNoID0gcmVzdWx0LmJhcmNvZGVzIHx8IHJlc3VsdDtcbiAgICB9XG5cbiAgICBFdmVudHMucHVibGlzaCgncHJvY2Vzc2VkJywgcmVzdWx0VG9QdWJsaXNoKTtcbiAgICBpZiAoX2hhc0NvZGVSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICBFdmVudHMucHVibGlzaCgnZGV0ZWN0ZWQnLCByZXN1bHRUb1B1Ymxpc2gpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX2xvY2F0ZUFuZERlY29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBib3hlcyA9IF9jb25maWcubG9jYXRlID8gX2xvY2F0b3IubG9jYXRlKCkgOiBbX2JveFNpemVdO1xuICAgIGNvbnN0IHJlc3VsdCA9IF9kZWNvZGVyLmRlY29kZUZyb21Cb3VuZGluZ0JveGVzKGJveGVzKTtcbiAgICBfcHVibGlzaFJlc3VsdChyZXN1bHQsIF9pbnB1dEltYWdlV3JhcHBlci5kYXRhKTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoX29uVUlUaHJlYWQpIHtcbiAgICAgICAgaWYgKF93b3JrZXJQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdvcmtlciA9IF93b3JrZXJQb29sLmZpbmQoKHsgYnVzeSB9KSA9PiAhYnVzeSk7XG4gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVdvcmtlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWxsIHdvcmtlcnMgYXJlIGJ1c3lcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YTtcblxuICAgICAgICAgICAgaWYgKF9mcmFtZUdyYWJiZXIuZ3JhYihpbWFnZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV29ya2VyLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdvcmtlci53b3JrZXIucG9zdE1lc3NhZ2UoeyBjbWQ6ICdwcm9jZXNzJywgaW1hZ2VEYXRhIH0sIFtpbWFnZURhdGEuYnVmZmVyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2ZyYW1lR3JhYmJlci5ncmFiKF9pbnB1dEltYWdlV3JhcHBlci5kYXRhKSkge1xuICAgICAgICAgICAgX2xvY2F0ZUFuZERlY29kZSgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2xvY2F0ZUFuZERlY29kZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX3N0YXJ0Q29udGludW91c1VwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWxheSA9IDEwMDAgLyAoX2NvbmZpZy5mcmVxdWVuY3kgfHwgNjApO1xuICAgIGxldCBuZXh0ID0gbnVsbDtcbiAgICBfc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgKGZ1bmN0aW9uIGZyYW1lKHRpbWVzdGFtcCk6IHZvaWQge1xuICAgICAgICBuZXh0ID0gbmV4dCB8fCB0aW1lc3RhbXA7XG4gICAgICAgIGlmICghX3N0b3BwZWQpIHtcbiAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgPj0gbmV4dCkge1xuICAgICAgICAgICAgICAgIG5leHQgKz0gZGVsYXk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICB9KHBlcmZvcm1hbmNlLm5vdygpKSk7XG59XG5cbmZ1bmN0aW9uIF9pbml0V29ya2VyKGNiOiAod29ya2VyVGhyZWFkOiBXb3JrZXJUaHJlYWQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBibG9iVVJMID0gX2dlbmVyYXRlV29ya2VyQmxvYigpO1xuICAgIGNvbnN0IHdvcmtlclRocmVhZCA9IHtcbiAgICAgICAgd29ya2VyOiBuZXcgV29ya2VyKGJsb2JVUkwpLFxuICAgICAgICBpbWFnZURhdGE6IG5ldyBVaW50OEFycmF5KF9pbnB1dFN0cmVhbS53aWR0aCAqIF9pbnB1dFN0cmVhbS5oZWlnaHQpLFxuICAgICAgICBidXN5OiB0cnVlXG4gICAgfTtcblxuICAgIHdvcmtlclRocmVhZC53b3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50ID09PSAnaW5pdGlhbGl6ZWQnKSB7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVUkwpO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNiKHdvcmtlclRocmVhZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudCA9PT0gJ3Byb2Nlc3NlZCcpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5pbWFnZURhdGEpO1xuICAgICAgICAgICAgX3B1Ymxpc2hSZXN1bHQoZGF0YS5yZXN1bHQsIHdvcmtlclRocmVhZC5pbWFnZURhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dvcmtlciBlcnJvcjonLCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHdvcmtlclRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBjbWQ6ICdpbml0JyxcbiAgICAgICAgc2l6ZTogeyB4OiBfaW5wdXRTdHJlYW0ud2lkdGgsIHk6IF9pbnB1dFN0cmVhbS5oZWlnaHQgfSxcbiAgICAgICAgaW1hZ2VEYXRhOiB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhLFxuICAgICAgICBjb25maWc6IG1lcmdlKF9jb25maWcsIHsgaW5wdXRTdHJlYW06IHsgdGFyZ2V0OiBudWxsIH0gfSlcbiAgICB9LCBbd29ya2VyVGhyZWFkLmltYWdlRGF0YS5idWZmZXJdKTtcbn1cblxuZnVuY3Rpb24gX3dvcmtlckludGVyZmFjZShmYWN0b3J5OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIGxldCBRdWFnZ2E6IGFueTtcbiAgICBjb25zdCB3b3JrZXI6IGFueSA9IHNlbGY7XG4gICAgbGV0IGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyO1xuXG4gICAgaWYgKGZhY3RvcnkpIHtcbiAgICAgICAgUXVhZ2dhID0gZmFjdG9yeSgpLmRlZmF1bHQ7XG4gICAgICAgIGlmICghUXVhZ2dhKSB7XG4gICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyBldmVudDogJ2Vycm9yJywgbWVzc2FnZTogJ1F1YWdnYSBjb3VsZCBub3QgYmUgY3JlYXRlZCcgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxmLm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5jbWQgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBRdWFnZ2FDb25maWcgPSBkYXRhLmNvbmZpZztcbiAgICAgICAgICAgIGNvbmZpZy5udW1PZldvcmtlcnMgPSAwO1xuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyID0gbmV3IFF1YWdnYS5JbWFnZVdyYXBwZXIoeyB4OiBkYXRhLnNpemUueCwgeTogZGF0YS5zaXplLnkgfSwgbmV3IFVpbnQ4QXJyYXkoZGF0YS5pbWFnZURhdGEpKTtcbiAgICAgICAgICAgIFF1YWdnYS5pbml0KFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAoKSA9PiB3b3JrZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIHsgZXZlbnQ6ICdpbml0aWFsaXplZCcsIGltYWdlRGF0YTogaW1hZ2VXcmFwcGVyLmRhdGEgfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl1cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGltYWdlV3JhcHBlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFF1YWdnYS5vblByb2Nlc3NlZCgocmVzdWx0OiBRdWFnZ2FCYXJjb2RlKSA9PlxuICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgeyBldmVudDogJ3Byb2Nlc3NlZCcsIGltYWdlRGF0YTogaW1hZ2VXcmFwcGVyLmRhdGEsIHJlc3VsdCB9LCBbaW1hZ2VXcmFwcGVyLmRhdGEuYnVmZmVyXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jbWQgPT09ICdwcm9jZXNzJykge1xuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLmRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBRdWFnZ2Euc3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNtZCA9PT0gJ3NldFJlYWRlcnMnKSB7XG4gICAgICAgICAgICBRdWFnZ2Euc2V0UmVhZGVycyhkYXRhLnJlYWRlcnMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gX2dlbmVyYXRlV29ya2VyQmxvYigpOiBzdHJpbmcge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsZXQgZmFjdG9yeVNvdXJjZTogc3RyaW5nID0gX19mYWN0b3J5U291cmNlX18gfHwgJyc7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtgKCR7X3dvcmtlckludGVyZmFjZS50b1N0cmluZygpfSkoJHtmYWN0b3J5U291cmNlfSk7YF0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG5cbiAgICByZXR1cm4gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG5cbmZ1bmN0aW9uIF9hZGp1c3RXb3JrZXJQb29sKGNhcGFjaXR5OiBudW1iZXIsIGNiPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGluY3JlYXNlQnkgPSBjYXBhY2l0eSAtIF93b3JrZXJQb29sLmxlbmd0aDtcblxuICAgIGlmIChpbmNyZWFzZUJ5ID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluY3JlYXNlQnk7IGkrKykge1xuICAgICAgICAgICAgX2luaXRXb3JrZXIod29ya2VyVGhyZWFkID0+IHtcbiAgICAgICAgICAgICAgICBfd29ya2VyUG9vbC5wdXNoKHdvcmtlclRocmVhZCk7XG4gICAgICAgICAgICAgICAgaWYgKF93b3JrZXJQb29sLmxlbmd0aCA+PSBjYXBhY2l0eSAmJiBjYikge1xuICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluY3JlYXNlQnkgPCAwKSB7XG4gICAgICAgICAgICBfd29ya2VyUG9vbC5zbGljZShpbmNyZWFzZUJ5KS5mb3JFYWNoKCh7IHdvcmtlciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgdGVybWluYXRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF93b3JrZXJQb29sID0gX3dvcmtlclBvb2wuc2xpY2UoMCwgaW5jcmVhc2VCeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNiICYmIGNiKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcblxuY29uc3QgTiA9IDE7XG5jb25zdCBXID0gMztcbmNvbnN0IFNUQVJUX1BBVFRFUk4gPSBbVywgTiwgVywgTiwgTiwgTl07XG5jb25zdCBTVE9QX1BBVFRFUk4gPSBbVywgTiwgTiwgTiwgV107XG5jb25zdCBDT0RFX1BBVFRFUk4gPSBbXG4gICAgW04sIE4sIFcsIFcsIE5dLFxuICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICBbTiwgVywgTiwgTiwgV10sXG4gICAgW1csIFcsIE4sIE4sIE5dLFxuICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICBbVywgTiwgVywgTiwgTl0sXG4gICAgW04sIFcsIFcsIE4sIE5dLFxuICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICBbVywgTiwgTiwgVywgTl0sXG4gICAgW04sIFcsIE4sIFcsIE5dXG5dO1xuY29uc3Qgc3RhcnRQYXR0ZXJuTGVuZ3RoID0gU1RBUlRfUEFUVEVSTi5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyB2YWwsIDApO1xuXG5leHBvcnQgY2xhc3MgVHdvT2ZGaXZlUmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBfYmFyU3BhY2VSYXRpbzogW251bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICB0aGlzLl9iYXJTcGFjZVJhdGlvID0gWzEsIDFdO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnMm9mNSc7XG4gICAgICAgIHRoaXMuX3NpbmdsZUNvZGVFcnJvciA9IDAuNzg7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VDb2RlRXJyb3IgPSAwLjMwO1xuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRFbmQoKTtcblxuICAgICAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgMCk7XG5cbiAgICAgICAgaWYgKGNvdW50ZXJzLmxlbmd0aCAlIDEwICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG5cbiAgICAgICAgaWYgKCFjb2RlIHx8IHJlc3VsdC5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgbGV0IG5hcnJvd0JhcldpZHRoID0gMTtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbzogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUQVJUX1BBVFRFUk4sIG9mZnNldCwgMCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gKHN0YXJ0SW5mby5lbmQgLSBzdGFydEluZm8uc3RhcnQpIC8gc3RhcnRQYXR0ZXJuTGVuZ3RoIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDU7XG5cbiAgICAgICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LCBzdGFydEluZm8uc3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMjtcblxuICAgICAgICBpZiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZCgpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RPUF9QQVRURVJOLCBvZmZzZXQsIDAsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kSW5mby5zdGFydDtcbiAgICAgICAgZW5kSW5mby5zdGFydCA9IHRoaXMuX3Jvdy5sZW5ndGggLSBlbmRJbmZvLmVuZDtcbiAgICAgICAgZW5kSW5mby5lbmQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gc3RhcnQ7XG5cbiAgICAgICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyB0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaDogQmFyY29kZUluZm8gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IENPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2guZXJyb3IgPCB0aGlzLkFWRVJBR0VfQ09ERV9FUlJPUiA/IGJlc3RNYXRjaCA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbz4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLl9iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb3VudGVyKTtcblxuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbn1cbiIsImV4cG9ydCBlbnVtIEJhcmNvZGVEaXJlY3Rpb24ge1xuICAgIEZvcndhcmQgPSAxLFxuICAgIFJldmVyc2UgPSAtMVxufTtcblxuZXhwb3J0IHR5cGUgQmFyY29kZUZvcm1hdCA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgQmFyY29kZVJlYWRlclR5cGUgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEJhcmNvZGVSZWFkZXJEZWNsYXJhdGlvbiA9IEJhcmNvZGVSZWFkZXJUeXBlIHwgeyBmb3JtYXQ6IEJhcmNvZGVSZWFkZXJUeXBlOyBjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWc7IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZVJlYWRlckNvbmZpZyB7XG4gICAgbm9ybWFsaXplQmFyU3BhY2VXaWR0aD86IGJvb2xlYW47XG4gICAgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyVHlwZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZUNvcnJlY3Rpb24ge1xuICAgIGJhcjogbnVtYmVyO1xuICAgIHNwYWNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZUluZm8ge1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgY29ycmVjdGlvbj86IEJhcmNvZGVDb3JyZWN0aW9uO1xuICAgIGVuZD86IG51bWJlcjtcbiAgICBlbmRDb3VudGVyPzogbnVtYmVyO1xuICAgIGVycm9yPzogbnVtYmVyO1xuICAgIHN0YXJ0PzogbnVtYmVyO1xuICAgIHN0YXJ0Q291bnRlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlIHtcbiAgICBjb2RlPzogc3RyaW5nO1xuICAgIGNvZGVzZXQ/OiBudW1iZXI7XG4gICAgY29ycmVjdGlvbj86IEJhcmNvZGVDb3JyZWN0aW9uO1xuICAgIGRlY29kZWRDb2Rlcz86IEFycmF5PHN0cmluZyB8IEJhcmNvZGVJbmZvPjtcbiAgICBkaXJlY3Rpb24/OiBCYXJjb2RlRGlyZWN0aW9uO1xuICAgIGVuZD86IG51bWJlcjtcbiAgICBlbmRJbmZvPzogQmFyY29kZUluZm87XG4gICAgZm9ybWF0PzogQmFyY29kZUZvcm1hdDtcbiAgICBzdGFydD86IG51bWJlcjtcbiAgICBzdGFydEluZm8/OiBCYXJjb2RlSW5mbztcbiAgICBzdXBwbGVtZW50PzogQmFyY29kZTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByb3RlY3RlZCBfc2luZ2xlQ29kZUVycm9yOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9hdmVyYWdlQ29kZUVycm9yOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IEJhcmNvZGVGb3JtYXQ7XG4gICAgcHJvdGVjdGVkIF9yb3c6IEFycmF5PG51bWJlcj47XG5cbiAgICBjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWc7XG4gICAgc3VwcGxlbWVudHM6IEFycmF5PEJhcmNvZGVSZWFkZXI+O1xuXG4gICAgc3RhdGljIGdldCBFeGNlcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBTdGFydE5vdEZvdW5kRXhjZXB0aW9uOiAnU3RhcnQtSW5mbyB3YXMgbm90IGZvdW5kIScsXG4gICAgICAgICAgICBDb2RlTm90Rm91bmRFeGNlcHRpb246ICdDb2RlIGNvdWxkIG5vdCBiZSBmb3VuZCEnLFxuICAgICAgICAgICAgUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uOiAnUGF0dGVybiBjb3VsZCBub3QgYmUgZm91bmQhJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBTSU5HTEVfQ09ERV9FUlJPUigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2luZ2xlQ29kZUVycm9yO1xuICAgIH1cblxuICAgIGdldCBBVkVSQUdFX0NPREVfRVJST1IoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2ZXJhZ2VDb2RlRXJyb3I7XG4gICAgfVxuXG4gICAgZ2V0IEZPUk1BVCgpOiBCYXJjb2RlRm9ybWF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICd1bmtub3duJztcbiAgICAgICAgdGhpcy5fcm93ID0gW107XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgICB0aGlzLnN1cHBsZW1lbnRzID0gc3VwcGxlbWVudHM7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogQmFyY29kZTtcblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogMCB8IDEsIHRyeUhhcmRlcjogYm9vbGVhbik6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IG5ldyBBcnJheTxudW1iZXI+KHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkVSQUdFX0NPREVfRVJST1I7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY291bnRlci5maWxsKDApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIGNvdW50ZXIucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodHJ5SGFyZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoIC0gMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDJdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAxXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9IGlzV2hpdGUgPyAwIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25leHRVbnNldChsaW5lOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0IHx8IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9uZXh0U2V0KGxpbmU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQgfHwgMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWF0Y2hSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQgPCAwID8gMCA6IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWF0Y2hQYXR0ZXJuKGNvdW50ZXI6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgY29kZTogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBtYXhTaW5nbGVFcnJvcj86IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBlcnJvciA9IDA7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgbW9kdWxvID0gMDtcblxuICAgICAgICBtYXhTaW5nbGVFcnJvciA9IG1heFNpbmdsZUVycm9yIHx8IHRoaXMuU0lOR0xFX0NPREVfRVJST1IgfHwgMTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2ldO1xuICAgICAgICAgICAgbW9kdWxvICs9IGNvZGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VtIDwgbW9kdWxvKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhcldpZHRoID0gc3VtIC8gbW9kdWxvO1xuICAgICAgICBtYXhTaW5nbGVFcnJvciAqPSBiYXJXaWR0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY291bnRlcltpXTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZCA9IGNvZGVbaV0gKiBiYXJXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZUVycm9yID0gTWF0aC5hYnMoY291bnQgLSBzY2FsZWQpIC8gc2NhbGVkO1xuXG4gICAgICAgICAgICBpZiAoc2luZ2xlRXJyb3IgPiBtYXhTaW5nbGVFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvciArPSBzaW5nbGVFcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvciAvIG1vZHVsbztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NvcnJlY3RCYXJzKGNvdW50ZXI6IEFycmF5PG51bWJlcj4sIGNvcnJlY3Rpb246IG51bWJlciwgaW5kaWNlczogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBsZXQgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgIGxldCB0bXAgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgICAgdG1wID0gY291bnRlcltpbmRpY2VzW2xlbmd0aF1dICogKDEgLSAoKDEgLSBjb3JyZWN0aW9uKSAvIDIpKTtcbiAgICAgICAgICAgIGlmICh0bXAgPiAxKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpbmRpY2VzW2xlbmd0aF1dID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVjb2RlUGF0dGVybihwYXR0ZXJuOiBBcnJheTxudW1iZXI+KTogQmFyY29kZSB7XG4gICAgICAgIHRoaXMuX3JvdyA9IHBhdHRlcm47XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kaXJlY3Rpb24gPSBCYXJjb2RlRGlyZWN0aW9uLlJldmVyc2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5zdGFydDtcbiAgICAgICAgICAgICAgICByZXN1bHQuZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZURpcmVjdGlvbi5Gb3J3YXJkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0LmZvcm1hdCA9IHRoaXMuRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfZmlsbENvdW50ZXJzKG9mZnNldDogbnVtYmVyLCBlbmQ6IG51bWJlciwgaXNXaGl0ZTogMCB8IDEpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgY291bnRlcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnRlcnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90b0NvdW50ZXJzKHN0YXJ0OiBudW1iZXIsIGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IFVpbnQxNkFycmF5IHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGg7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IHRoaXMuX3Jvd1tzdGFydF0gPyAwIDogMTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGNvdW50ZXJzLmZpbGwoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBudW1Db3VudGVycykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50ZXJzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OS0kOi8uK0FCQ0QnO1xuY29uc3QgQUxQSEFCRVQgPSBbLi4uQUxQSEFCRVRIX1NUUklOR10ubWFwKGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbi8vIGNvbnN0IEFMUEhBQkVUID0gWzQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA0NSwgMzYsIDU4LCA0NywgNDYsIDQzLCA2NSwgNjYsIDY3LCA2OF07XG5jb25zdCBDSEFSQUNURVJfRU5DT0RJTkdTID0gWzB4MDAzLCAweDAwNiwgMHgwMDksIDB4MDYwLCAweDAxMiwgMHgwNDIsIDB4MDIxLCAweDAyNCwgMHgwMzAsIDB4MDQ4LCAweDAwYywgMHgwMTgsIDB4MDQ1LFxuICAgIDB4MDUxLCAweDA1NCwgMHgwMTUsIDB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFXTtcbmNvbnN0IFNUQVJUX0VORCA9IFsweDAxQSwgMHgwMjksIDB4MDBCLCAweDAwRV07XG5jb25zdCBNSU5fRU5DT0RFRF9DSEFSUyA9IDQ7XG5jb25zdCBNQVhfQUNDRVBUQUJMRSA9IDIuMDtcbmNvbnN0IFBBRERJTkcgPSAxLjU7XG5cbmludGVyZmFjZSBUaHJlc2hvbGQge1xuICAgIHNwYWNlOiB7XG4gICAgICAgIG5hcnJvdzoge1xuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICAgICAgY291bnRzOiBudW1iZXI7XG4gICAgICAgICAgICBtaW46IG51bWJlcjtcbiAgICAgICAgICAgIG1heDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICB3aWRlOiB7XG4gICAgICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgICAgICBjb3VudHM6IG51bWJlcjtcbiAgICAgICAgICAgIG1pbjogbnVtYmVyO1xuICAgICAgICAgICAgbWF4OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBiYXI6IHtcbiAgICAgICAgbmFycm93OiB7XG4gICAgICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgICAgICBjb3VudHM6IG51bWJlcjtcbiAgICAgICAgICAgIG1pbjogbnVtYmVyO1xuICAgICAgICAgICAgbWF4OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIHdpZGU6IHtcbiAgICAgICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgICAgIGNvdW50czogbnVtYmVyO1xuICAgICAgICAgICAgbWluOiBudW1iZXI7XG4gICAgICAgICAgICBtYXg6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29kYWJhclJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByaXZhdGUgX2NvdW50ZXJzOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2NvZGFiYXInO1xuICAgICAgICB0aGlzLl9jb3VudGVycyA9IFtdO1xuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgdGhpcy5fY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnModGhpcy5fbmV4dFVuc2V0KHRoaXMuX3JvdyksIHRoaXMuX3Jvdy5sZW5ndGgsIDEpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHN0YXJ0LnN0YXJ0Q291bnRlcjtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKG5leHRTdGFydCk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWRDaGFyID0gdGhpcy5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IDg7XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEgJiYgU1RBUlRfRU5ELnNvbWUoY29kZSA9PiBjb2RlID09PSBwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChuZXh0U3RhcnQgPCB0aGlzLl9jb3VudGVycy5sZW5ndGgpO1xuXG4gICAgICAgIC8vIHZlcmlmeSBlbmRcbiAgICAgICAgaWYgKChyZXN1bHQubGVuZ3RoIC0gMikgPCBNSU5fRU5DT0RFRF9DSEFSUyB8fCAhU1RBUlRfRU5ELnNvbWUoY29kZSA9PiBjb2RlID09PSBwYXR0ZXJuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2ZXJpZnkgZW5kIHdoaXRlIHNwYWNlXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5V2hpdGVzcGFjZShzdGFydC5zdGFydENvdW50ZXIsIG5leHRTdGFydCAtIDgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVSZXN1bHQocmVzdWx0LCBzdGFydC5zdGFydENvdW50ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRTdGFydCA9IG5leHRTdGFydCA+IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCA/IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCA6IG5leHRTdGFydDtcbiAgICAgICAgY29uc3QgZW5kID0gc3RhcnQuc3RhcnQgKyB0aGlzLl9zdW1Db3VudGVycyhzdGFydC5zdGFydENvdW50ZXIsIG5leHRTdGFydCAtIDgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnQuc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0LFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiByZXN1bHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeVdoaXRlc3BhY2Uoc3RhcnRDb3VudGVyOiBudW1iZXIsIGVuZENvdW50ZXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHN0YXJ0Q291bnRlciAtIDEgPD0gMClcbiAgICAgICAgICAgIHx8IHRoaXMuX2NvdW50ZXJzW3N0YXJ0Q291bnRlciAtIDFdID49ICh0aGlzLl9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKHN0YXJ0Q291bnRlcikgLyAyLjApKSB7XG4gICAgICAgICAgICBpZiAoKGVuZENvdW50ZXIgKyA4ID49IHRoaXMuX2NvdW50ZXJzLmxlbmd0aClcbiAgICAgICAgICAgICAgICB8fCB0aGlzLl9jb3VudGVyc1tlbmRDb3VudGVyICsgN10gPj0gKHRoaXMuX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgoZW5kQ291bnRlcikgLyAyLjApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2FsY3VsYXRlUGF0dGVybkxlbmd0aChvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyA3OyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgc3RhcnRDb3VudGVyOiBudW1iZXIpOiBUaHJlc2hvbGQge1xuICAgICAgICBjb25zdCBjYXRlZ29yaXphdGlvbjogVGhyZXNob2xkID0ge1xuICAgICAgICAgICAgc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgIHdpZGU6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFyOiB7XG4gICAgICAgICAgICAgICAgbmFycm93OiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gc3RhcnRDb3VudGVyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IHRoaXMuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDY7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IChqICYgMSkgPT09IDIgPyBjYXRlZ29yaXphdGlvbi5iYXIgOiBjYXRlZ29yaXphdGlvbi5zcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICAgICAgY2F0LnNpemUgKz0gdGhpcy5fY291bnRlcnNbcG9zICsgal07XG4gICAgICAgICAgICAgICAgY2F0LmNvdW50cysrO1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gODtcbiAgICAgICAgfVxuXG4gICAgICAgIFsnc3BhY2UnLCAnYmFyJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2luZCA9IGNhdGVnb3JpemF0aW9uW2tleV07XG4gICAgICAgICAgICBraW5kLndpZGUubWluID0gTWF0aC5mbG9vcigoa2luZC5uYXJyb3cuc2l6ZSAvIGtpbmQubmFycm93LmNvdW50cyArIGtpbmQud2lkZS5zaXplIC8ga2luZC53aWRlLmNvdW50cykgLyAyKTtcbiAgICAgICAgICAgIGtpbmQubmFycm93Lm1heCA9IE1hdGguY2VpbChraW5kLndpZGUubWluKTtcbiAgICAgICAgICAgIGtpbmQud2lkZS5tYXggPSBNYXRoLmNlaWwoKGtpbmQud2lkZS5zaXplICogTUFYX0FDQ0VQVEFCTEUgKyBQQURESU5HKSAvIGtpbmQud2lkZS5jb3VudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2F0ZWdvcml6YXRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hhclRvUGF0dGVybihjaGFyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEFMUEhBQkVULmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQUxQSEFCRVRbaV0gPT09IGNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUl9FTkNPRElOR1NbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMHgwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbGlkYXRlUmVzdWx0KHJlc3VsdDogUmVhZG9ubHlBcnJheTxzdHJpbmc+LCBzdGFydENvdW50ZXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuKHJlc3VsdCwgc3RhcnRDb3VudGVyKTtcbiAgICAgICAgbGV0IHBvcyA9IHN0YXJ0Q291bnRlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSB0aGlzLl9jaGFyVG9QYXR0ZXJuKHJlc3VsdFtpXSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSA2OyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSAoaiAmIDEpID09PSAwID8gdGhyZXNob2xkLmJhciA6IHRocmVzaG9sZC5zcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGlmIChzaXplIDwgY2F0Lm1pbiB8fCBzaXplID4gY2F0Lm1heCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gODtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhdHRlcm5Ub0NoYXIocGF0dGVybjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKEFMUEhBQkVUW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgbGV0IG1heCA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnRlciA8IG1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKChtaW4gKyBtYXgpIC8gMi4wKSB8IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9QYXR0ZXJuKG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSA3O1xuICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXQgKyBudW1Db3VudGVycztcblxuICAgICAgICBpZiAoZW5kID4gdGhpcy5fY291bnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0LCBlbmQpO1xuICAgICAgICBjb25zdCBzcGFjZVRocmVzaG9sZCA9IHRoaXMuX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQgKyAxLCBlbmQpO1xuICAgICAgICBsZXQgYml0bWFzayA9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSk7XG4gICAgICAgIGxldCBwYXR0ZXJuID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IChpICYgMSkgPT09IDAgPyBiYXJUaHJlc2hvbGQgOiBzcGFjZVRocmVzaG9sZDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb3VudGVyc1tvZmZzZXQgKyBpXSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gfD0gYml0bWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdG1hc2sgPj49IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdW1Db3VudGVycyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jb3VudGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihpKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuICE9PSAtMSAmJiBTVEFSVF9FTkQuc29tZShjb2RlID0+IGNvZGUgPT09IHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogTG9vayBmb3Igd2hpdGVzcGFjZSBhaGVhZFxuICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMuX3N1bUNvdW50ZXJzKDAsIGkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5fc3VtQ291bnRlcnMoaSwgaSArIDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0Q291bnRlcjogaSxcbiAgICAgICAgICAgICAgICAgICAgZW5kQ291bnRlcjogaSArIDhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUNvcnJlY3Rpb24sIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IENPREVfU0hJRlQgPSA5ODtcbmNvbnN0IENPREVfQyA9IDk5O1xuY29uc3QgQ09ERV9CID0gMTAwO1xuY29uc3QgQ09ERV9BID0gMTAxO1xuY29uc3QgU1RBUlRfQ09ERV9BID0gMTAzO1xuY29uc3QgU1RBUlRfQ09ERV9CID0gMTA0O1xuY29uc3QgU1RBUlRfQ09ERV9DID0gMTA1O1xuY29uc3QgU1RPUF9DT0RFID0gMTA2O1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFsyLCAxLCAyLCAyLCAyLCAyXSxcbiAgICBbMiwgMiwgMiwgMSwgMiwgMl0sXG4gICAgWzIsIDIsIDIsIDIsIDIsIDFdLFxuICAgIFsxLCAyLCAxLCAyLCAyLCAzXSxcbiAgICBbMSwgMiwgMSwgMywgMiwgMl0sXG4gICAgWzEsIDMsIDEsIDIsIDIsIDJdLFxuICAgIFsxLCAyLCAyLCAyLCAxLCAzXSxcbiAgICBbMSwgMiwgMiwgMywgMSwgMl0sXG4gICAgWzEsIDMsIDIsIDIsIDEsIDJdLFxuICAgIFsyLCAyLCAxLCAyLCAxLCAzXSxcbiAgICBbMiwgMiwgMSwgMywgMSwgMl0sXG4gICAgWzIsIDMsIDEsIDIsIDEsIDJdLFxuICAgIFsxLCAxLCAyLCAyLCAzLCAyXSxcbiAgICBbMSwgMiwgMiwgMSwgMywgMl0sXG4gICAgWzEsIDIsIDIsIDIsIDMsIDFdLFxuICAgIFsxLCAxLCAzLCAyLCAyLCAyXSxcbiAgICBbMSwgMiwgMywgMSwgMiwgMl0sXG4gICAgWzEsIDIsIDMsIDIsIDIsIDFdLFxuICAgIFsyLCAyLCAzLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMSwgMSwgMywgMl0sXG4gICAgWzIsIDIsIDEsIDIsIDMsIDFdLFxuICAgIFsyLCAxLCAzLCAyLCAxLCAyXSxcbiAgICBbMiwgMiwgMywgMSwgMSwgMl0sXG4gICAgWzMsIDEsIDIsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAxLCAyLCAyLCAyXSxcbiAgICBbMywgMiwgMSwgMSwgMiwgMl0sXG4gICAgWzMsIDIsIDEsIDIsIDIsIDFdLFxuICAgIFszLCAxLCAyLCAyLCAxLCAyXSxcbiAgICBbMywgMiwgMiwgMSwgMSwgMl0sXG4gICAgWzMsIDIsIDIsIDIsIDEsIDFdLFxuICAgIFsyLCAxLCAyLCAxLCAyLCAzXSxcbiAgICBbMiwgMSwgMiwgMywgMiwgMV0sXG4gICAgWzIsIDMsIDIsIDEsIDIsIDFdLFxuICAgIFsxLCAxLCAxLCAzLCAyLCAzXSxcbiAgICBbMSwgMywgMSwgMSwgMiwgM10sXG4gICAgWzEsIDMsIDEsIDMsIDIsIDFdLFxuICAgIFsxLCAxLCAyLCAzLCAxLCAzXSxcbiAgICBbMSwgMywgMiwgMSwgMSwgM10sXG4gICAgWzEsIDMsIDIsIDMsIDEsIDFdLFxuICAgIFsyLCAxLCAxLCAzLCAxLCAzXSxcbiAgICBbMiwgMywgMSwgMSwgMSwgM10sXG4gICAgWzIsIDMsIDEsIDMsIDEsIDFdLFxuICAgIFsxLCAxLCAyLCAxLCAzLCAzXSxcbiAgICBbMSwgMSwgMiwgMywgMywgMV0sXG4gICAgWzEsIDMsIDIsIDEsIDMsIDFdLFxuICAgIFsxLCAxLCAzLCAxLCAyLCAzXSxcbiAgICBbMSwgMSwgMywgMywgMiwgMV0sXG4gICAgWzEsIDMsIDMsIDEsIDIsIDFdLFxuICAgIFszLCAxLCAzLCAxLCAyLCAxXSxcbiAgICBbMiwgMSwgMSwgMywgMywgMV0sXG4gICAgWzIsIDMsIDEsIDEsIDMsIDFdLFxuICAgIFsyLCAxLCAzLCAxLCAxLCAzXSxcbiAgICBbMiwgMSwgMywgMywgMSwgMV0sXG4gICAgWzIsIDEsIDMsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAxLCAxLCAyLCAzXSxcbiAgICBbMywgMSwgMSwgMywgMiwgMV0sXG4gICAgWzMsIDMsIDEsIDEsIDIsIDFdLFxuICAgIFszLCAxLCAyLCAxLCAxLCAzXSxcbiAgICBbMywgMSwgMiwgMywgMSwgMV0sXG4gICAgWzMsIDMsIDIsIDEsIDEsIDFdLFxuICAgIFszLCAxLCA0LCAxLCAxLCAxXSxcbiAgICBbMiwgMiwgMSwgNCwgMSwgMV0sXG4gICAgWzQsIDMsIDEsIDEsIDEsIDFdLFxuICAgIFsxLCAxLCAxLCAyLCAyLCA0XSxcbiAgICBbMSwgMSwgMSwgNCwgMiwgMl0sXG4gICAgWzEsIDIsIDEsIDEsIDIsIDRdLFxuICAgIFsxLCAyLCAxLCA0LCAyLCAxXSxcbiAgICBbMSwgNCwgMSwgMSwgMiwgMl0sXG4gICAgWzEsIDQsIDEsIDIsIDIsIDFdLFxuICAgIFsxLCAxLCAyLCAyLCAxLCA0XSxcbiAgICBbMSwgMSwgMiwgNCwgMSwgMl0sXG4gICAgWzEsIDIsIDIsIDEsIDEsIDRdLFxuICAgIFsxLCAyLCAyLCA0LCAxLCAxXSxcbiAgICBbMSwgNCwgMiwgMSwgMSwgMl0sXG4gICAgWzEsIDQsIDIsIDIsIDEsIDFdLFxuICAgIFsyLCA0LCAxLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMSwgMSwgMSwgNF0sXG4gICAgWzQsIDEsIDMsIDEsIDEsIDFdLFxuICAgIFsyLCA0LCAxLCAxLCAxLCAyXSxcbiAgICBbMSwgMywgNCwgMSwgMSwgMV0sXG4gICAgWzEsIDEsIDEsIDIsIDQsIDJdLFxuICAgIFsxLCAyLCAxLCAxLCA0LCAyXSxcbiAgICBbMSwgMiwgMSwgMiwgNCwgMV0sXG4gICAgWzEsIDEsIDQsIDIsIDEsIDJdLFxuICAgIFsxLCAyLCA0LCAxLCAxLCAyXSxcbiAgICBbMSwgMiwgNCwgMiwgMSwgMV0sXG4gICAgWzQsIDEsIDEsIDIsIDEsIDJdLFxuICAgIFs0LCAyLCAxLCAxLCAxLCAyXSxcbiAgICBbNCwgMiwgMSwgMiwgMSwgMV0sXG4gICAgWzIsIDEsIDIsIDEsIDQsIDFdLFxuICAgIFsyLCAxLCA0LCAxLCAyLCAxXSxcbiAgICBbNCwgMSwgMiwgMSwgMiwgMV0sXG4gICAgWzEsIDEsIDEsIDEsIDQsIDNdLFxuICAgIFsxLCAxLCAxLCAzLCA0LCAxXSxcbiAgICBbMSwgMywgMSwgMSwgNCwgMV0sXG4gICAgWzEsIDEsIDQsIDEsIDEsIDNdLFxuICAgIFsxLCAxLCA0LCAzLCAxLCAxXSxcbiAgICBbNCwgMSwgMSwgMSwgMSwgM10sXG4gICAgWzQsIDEsIDEsIDMsIDEsIDFdLFxuICAgIFsxLCAxLCAzLCAxLCA0LCAxXSxcbiAgICBbMSwgMSwgNCwgMSwgMywgMV0sXG4gICAgWzMsIDEsIDEsIDEsIDQsIDFdLFxuICAgIFs0LCAxLCAxLCAxLCAzLCAxXSxcbiAgICBbMiwgMSwgMSwgNCwgMSwgMl0sXG4gICAgWzIsIDEsIDEsIDIsIDEsIDRdLFxuICAgIFsyLCAxLCAxLCAyLCAzLCAyXSxcbiAgICBbMiwgMywgMywgMSwgMSwgMSwgMl1cbl07XG5jb25zdCBNT0RVTEVfSU5ESUNFUyA9IHsgYmFyOiBbMCwgMiwgNF0sIHNwYWNlOiBbMSwgMywgNV0gfTtcblxuZXhwb3J0IGNsYXNzIENvZGUxMjhSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnY29kZV8xMjgnO1xuICAgICAgICB0aGlzLl9zaW5nbGVDb2RlRXJyb3IgPSAwLjY0O1xuICAgICAgICB0aGlzLl9hdmVyYWdlQ29kZUVycm9yID0gMC4zMDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZUNvZGUoc3RhcnQ6IG51bWJlciwgY29ycmVjdGlvbjogQmFyY29kZUNvcnJlY3Rpb24pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2g6IEJhcmNvZGVJbmZvID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnQsXG4gICAgICAgICAgICBjb3JyZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgYmFyOiAxLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSB0aGlzLkFWRVJBR0VfQ09ERV9FUlJPUjtcbiAgICAgICAgbGV0IGlzV2hpdGU6IDAgfCAxID0gdGhpcy5fcm93W29mZnNldF0gPyAwIDogMTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3JyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3JyZWN0KGNvdW50ZXIsIGNvcnJlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29kZSA9IDA7IGNvZGUgPCBDT0RFX1BBVFRFUk4ubGVuZ3RoOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmNvZGUgPT09IC0xIHx8IGJlc3RNYXRjaC5lcnJvciA+IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBDT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuX2NhbGN1bGF0ZUNvcnJlY3Rpb24oZXhwZWN0ZWQsIGNvdW50ZXIsIE1PRFVMRV9JTkRJQ0VTLmJhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29ycmVjdGlvbi5zcGFjZSA9IHRoaXMuX2NhbGN1bGF0ZUNvcnJlY3Rpb24oZXhwZWN0ZWQsIGNvdW50ZXIsIE1PRFVMRV9JTkRJQ0VTLnNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb3JyZWN0KGNvdW50ZXI6IEFycmF5PG51bWJlcj4sIGNvcnJlY3Rpb246IEJhcmNvZGVDb3JyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvcnJlY3RCYXJzKGNvdW50ZXIsIGNvcnJlY3Rpb24uYmFyLCBNT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLnNwYWNlLCBNT0RVTEVfSU5ESUNFUy5zcGFjZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogMSxcbiAgICAgICAgICAgICAgICBzcGFjZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkVSQUdFX0NPREVfRVJST1I7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IHN1bTogbnVtYmVyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNvdW50ZXJbal07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29kZSA9IFNUQVJUX0NPREVfQTsgY29kZSA8PSBTVEFSVF9DT0RFX0M7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIHN1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uYmFyID0gdGhpcy5fY2FsY3VsYXRlQ29ycmVjdGlvbihDT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9JTkRJQ0VTLmJhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29ycmVjdGlvbi5zcGFjZSA9IHRoaXMuX2NhbGN1bGF0ZUNvcnJlY3Rpb24oQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfSU5ESUNFUy5zcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzRdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmcgfCBudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm8gPSBudWxsO1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgbXVsdGlwbGllciA9IDA7XG4gICAgICAgIGxldCBjaGVja3N1bSA9IDA7XG4gICAgICAgIGxldCBjb2Rlc2V0OiBudW1iZXI7XG4gICAgICAgIGxldCByYXdSZXN1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBsZXQgZGVjb2RlZENvZGVzID0gbmV3IEFycmF5PEJhcmNvZGVJbmZvPigpO1xuICAgICAgICBsZXQgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCB1bnNoaWZ0OiBib29sZWFuO1xuICAgICAgICBsZXQgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29kZSA9IHtcbiAgICAgICAgICAgIGNvZGU6IHN0YXJ0SW5mby5jb2RlLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRJbmZvLmVuZCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IHN0YXJ0SW5mby5jb3JyZWN0aW9uLmJhcixcbiAgICAgICAgICAgICAgICBzcGFjZTogc3RhcnRJbmZvLmNvcnJlY3Rpb24uc3BhY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIGNoZWNrc3VtID0gY29kZS5jb2RlO1xuXG4gICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFNUQVJUX0NPREVfQTpcbiAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9BO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTVEFSVF9DT0RFX0I6XG4gICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU1RBUlRfQ09ERV9DOlxuICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICAgICAgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlLmVuZCwgY29kZS5jb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IFNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyKys7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9IG11bHRpcGxpZXIgKiBjb2RlLmNvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2Rlc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ERV9BOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlIDwgNjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUuY29kZSA8IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlLmNvZGUgLSA2NCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBTVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfU0hJRlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9DO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgzMiArIGNvZGUuY29kZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBTVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfU0hJRlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9DO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSA8IDEwID8gJzAnICsgY29kZS5jb2RlIDogY29kZS5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ERV9COlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfQ09ERTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuc2hpZnQpIHtcbiAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gY29kZXNldCA9PT0gQ09ERV9BID8gQ09ERV9CIDogQ09ERV9BO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZS5lbmQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrc3VtIC09IG11bHRpcGxpZXIgKiByYXdSZXN1bHRbcmF3UmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2hlY2tzdW0gJSAxMDMgIT09IHJhd1Jlc3VsdFtyYXdSZXN1bHQubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBsYXN0IGNvZGUgZnJvbSByZXN1bHQgKGNoZWNrc3VtKVxuICAgICAgICBpZiAocmVtb3ZlTGFzdENoYXJhY3Rlcikge1xuICAgICAgICAgICAgcmVzdWx0LnNwbGljZShyZXN1bHQubGVuZ3RoIC0gMSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmQsXG4gICAgICAgICAgICBjb2Rlc2V0LFxuICAgICAgICAgICAgc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLFxuICAgICAgICAgICAgZW5kSW5mbzogY29kZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMjtcblxuICAgICAgICBpZiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgIGV4cGVjdGVkOiBSZWFkb25seUFycmF5PG51bWJlcj4sXG4gICAgICAgIG5vcm1hbGl6ZWQ6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPixcbiAgICAgICAgaW5kaWNlczogUmVhZG9ubHlBcnJheTxudW1iZXI+XG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHN1bU5vcm1hbGl6ZWQgPSAwO1xuICAgICAgICBsZXQgc3VtRXhwZWN0ZWQgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGxlbmd0aCA9IGluZGljZXMubGVuZ3RoOyBsZW5ndGgtLTspIHtcbiAgICAgICAgICAgIHN1bUV4cGVjdGVkICs9IGV4cGVjdGVkW2luZGljZXNbbGVuZ3RoXV07XG4gICAgICAgICAgICBzdW1Ob3JtYWxpemVkICs9IG5vcm1hbGl6ZWRbaW5kaWNlc1tsZW5ndGhdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW1FeHBlY3RlZCAvIHN1bU5vcm1hbGl6ZWQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcblxuY29uc3QgQVNURVJJU0sgPSAweDA5NDtcbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gKiQvKyUnO1xuY29uc3QgQUxQSEFCRVQgPSBuZXcgVWludDE2QXJyYXkoWy4uLkFMUEhBQkVUSF9TVFJJTkddLm1hcChjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuLy8gY29uc3QgQUxQSEFCRVQgPSBbNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCxcbi8vICAgICA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA0NSwgNDYsIDMyLCA0MiwgMzYsIDQ3LCA0MywgMzddO1xuY29uc3QgQ0hBUkFDVEVSX0VOQ09ESU5HUyA9IG5ldyBVaW50MTZBcnJheShbXG4gICAgMHgwMzQsIDB4MTIxLCAweDA2MSwgMHgxNjAsIDB4MDMxLCAweDEzMCwgMHgwNzAsIDB4MDI1LCAweDEyNCwgMHgwNjQsIDB4MTA5LCAweDA0OSwgMHgxNDgsIDB4MDE5LCAweDExOCwgMHgwNTgsXG4gICAgMHgwMEQsIDB4MTBDLCAweDA0QywgMHgwMUMsIDB4MTAzLCAweDA0MywgMHgxNDIsIDB4MDEzLCAweDExMiwgMHgwNTIsIDB4MDA3LCAweDEwNiwgMHgwNDYsIDB4MDE2LCAweDE4MSwgMHgwQzEsXG4gICAgMHgxQzAsIDB4MDkxLCAweDE5MCwgMHgwRDAsIDB4MDg1LCAweDE4NCwgMHgwQzQsIDB4MDk0LCAweDBBOCwgMHgwQTIsIDB4MDhBLCAweDAyQVxuXSk7XG5cbmV4cG9ydCBjbGFzcyBDb2RlMzlSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnY29kZV8zOSc7XG4gICAgfVxuXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgbGV0IGNvdW50ZXJzID0gbmV3IFVpbnQxNkFycmF5KDkpO1xuICAgICAgICBsZXQgZGVjb2RlZENoYXI6IHN0cmluZztcbiAgICAgICAgbGV0IGxhc3RTdGFydDogbnVtYmVyO1xuICAgICAgICBsZXQgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIHN0YXJ0LmVuZCk7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdGhpcy5fdG9Db3VudGVycyhuZXh0U3RhcnQsIGNvdW50ZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4oY291bnRlcnMpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ2hhciA9IHRoaXMuX3BhdHRlcm5Ub0NoYXIocGF0dGVybik7XG4gICAgICAgICAgICBpZiAoZGVjb2RlZENoYXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDtcbiAgICAgICAgICAgIG5leHRTdGFydCArPSBjb3VudGVycy5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbSwgMCk7XG4gICAgICAgICAgICBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICAgICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UobGFzdFN0YXJ0LCBuZXh0U3RhcnQsIGNvdW50ZXJzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBuZXh0U3RhcnQsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0LFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiByZXN1bHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhdHRlcm5Ub0NoYXIocGF0dGVybik6IHN0cmluZyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGxhc3RTdGFydDogbnVtYmVyLCBuZXh0U3RhcnQ6IG51bWJlciwgY291bnRlcnM6IFVpbnQxNkFycmF5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5TaXplID0gY291bnRlcnMucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0sIDApO1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBuZXh0U3RhcnQgLSBsYXN0U3RhcnQgLSBwYXR0ZXJuU2l6ZTtcbiAgICAgICAgcmV0dXJuICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgKiAzKSA+PSBwYXR0ZXJuU2l6ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kTmV4dFdpZHRoKGNvdW50ZXJzOiBVaW50MTZBcnJheSwgY3VycmVudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG1pbldpZHRoID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY291bnRlcnNbaV0gPCBtaW5XaWR0aCAmJiBjb3VudGVyc1tpXSA+IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aCA9IGNvdW50ZXJzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pbldpZHRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvUGF0dGVybihjb3VudGVyczogVWludDE2QXJyYXkpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IG1heE5hcnJvd1dpZHRoID0gMDtcbiAgICAgICAgbGV0IG51bVdpZGVCYXJzID0gbnVtQ291bnRlcnM7XG4gICAgICAgIGxldCB3aWRlQmFyV2lkdGggPSAwO1xuICAgICAgICBsZXQgcGF0dGVybjogbnVtYmVyO1xuXG4gICAgICAgIHdoaWxlIChudW1XaWRlQmFycyA+IDMpIHtcbiAgICAgICAgICAgIG1heE5hcnJvd1dpZHRoID0gdGhpcy5fZmluZE5leHRXaWR0aChjb3VudGVycywgbWF4TmFycm93V2lkdGgpO1xuICAgICAgICAgICAgbnVtV2lkZUJhcnMgPSAwO1xuICAgICAgICAgICAgcGF0dGVybiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlcnNbaV0gPiBtYXhOYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuIHw9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSAtIGkpO1xuICAgICAgICAgICAgICAgICAgICBudW1XaWRlQmFycysrO1xuICAgICAgICAgICAgICAgICAgICB3aWRlQmFyV2lkdGggKz0gY291bnRlcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtV2lkZUJhcnMgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzICYmIG51bVdpZGVCYXJzID4gMDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyc1tpXSA+IG1heE5hcnJvd1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1XaWRlQmFycy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb3VudGVyc1tpXSAqIDIpID49IHdpZGVCYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBwYXR0ZXJuU3RhcnQgPSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDE2QXJyYXkoOSk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IGlzV2hpdGU6IDAgfCAxID0gMDtcbiAgICAgICAgbGV0IHdoaXRlU3BhY2VNdXN0U3RhcnQ6IG51bWJlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHN0YXJ0IHBhdHRlcm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RvUGF0dGVybihjb3VudGVyKSA9PT0gQVNURVJJU0spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2VNdXN0U3RhcnQgPSBNYXRoLm1heCgwLCBwYXR0ZXJuU3RhcnQgLSAoKGkgLSBwYXR0ZXJuU3RhcnQpIC8gNCkpIHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKHdoaXRlU3BhY2VNdXN0U3RhcnQsIHBhdHRlcm5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcGF0dGVyblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJbMF0gKyBjb3VudGVyWzFdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbN10gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzhdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9IGlzV2hpdGUgPyAwIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcbmltcG9ydCB7IENvZGUzOVJlYWRlciB9IGZyb20gJy4vY29kZS0zOS1yZWFkZXInO1xuXG5leHBvcnQgY2xhc3MgQ29kZTM5VklOUmVhZGVyIGV4dGVuZHMgQ29kZTM5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnY29kZV8zOV92aW4nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBib3Jyb3dzXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL3p4aW5nL3p4aW5nL2Jsb2IvbWFzdGVyL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3p4aW5nL2NsaWVudC9yZXN1bHQvVklOUmVzdWx0UGFyc2VyLmphdmFcbiAgICAgKi9cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlY29kZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5jb2RlO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9bSU9RXS9nLCAnJyk7XG5cbiAgICAgICAgaWYgKCEvW0EtWjAtOV17MTd9Ly50ZXN0KGNvZGUpKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgQVowOSBwYXR0ZXJuIGNvZGU6JywgY29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tDaGVja3N1bShjb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tDaGVja3N1bShjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICByZXR1cm4gISFjb2RlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gJC8rJWFiY2QqJztcbmNvbnN0IEFMUEhBQkVUID0gbmV3IFVpbnQxNkFycmF5KFsuLi5BTFBIQUJFVEhfU1RSSU5HXS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MTE0LCAweDE0OCwgMHgxNDQsIDB4MTQyLCAweDEyOCwgMHgxMjQsIDB4MTIyLCAweDE1MCwgMHgxMTIsIDB4MTBBLCAweDFBOCwgMHgxQTQsIDB4MUEyLCAweDE5NCwgMHgxOTIsIDB4MThBLFxuICAgIDB4MTY4LCAweDE2NCwgMHgxNjIsIDB4MTM0LCAweDExQSwgMHgxNTgsIDB4MTRDLCAweDE0NiwgMHgxMkMsIDB4MTE2LCAweDFCNCwgMHgxQjIsIDB4MUFDLCAweDFBNiwgMHgxOTYsIDB4MTlBLFxuICAgIDB4MTZDLCAweDE2NiwgMHgxMzYsIDB4MTNBLCAweDEyRSwgMHgxRDQsIDB4MUQyLCAweDFDQSwgMHgxNkUsIDB4MTc2LCAweDFBRSwgMHgxMjYsIDB4MURBLCAweDFENiwgMHgxMzIsIDB4MTVFXG5dKTtcbmNvbnN0IEFTVEVSSVNLID0gMHgxNUU7XG5cbmV4cG9ydCBjbGFzcyBDb2RlOTNSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnY29kZV85Myc7XG4gICAgfVxuXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheSg2KTtcbiAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmc7XG4gICAgICAgIGxldCBsYXN0U3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBzdGFydC5lbmQpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycyk7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGNvdW50ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnMucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0sIDApO1xuICAgICAgICAgICAgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIG5leHRTdGFydCk7XG4gICAgICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9PSAnKicpO1xuICAgICAgICByZXN1bHQucG9wKCk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5RW5kKGxhc3RTdGFydCwgbmV4dFN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeUNoZWNrc3VtcyhyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCByZXN1bHQubGVuZ3RoIC0gMik7XG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fZGVjb2RlRXh0ZW5kZWQocmVzdWx0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm46IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmVyaWZ5RW5kKGxhc3RTdGFydDogbnVtYmVyLCBuZXh0U3RhcnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobGFzdFN0YXJ0ID09PSBuZXh0U3RhcnQgfHwgIXRoaXMuX3Jvd1tuZXh0U3RhcnRdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9QYXR0ZXJuKGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gY291bnRlcnMubGVuZ3RoO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBNYXRoLnJvdW5kKGNvdW50ZXJzW2ldICogOSAvIHN1bSk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA8IDEgfHwgbm9ybWFsaXplZCA+IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgJiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsaXplZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAocGF0dGVybiA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIDw8PSBub3JtYWxpemVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50MTZBcnJheSg2KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgcGF0dGVyblN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlTXVzdFN0YXJ0OiBudW1iZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5tYXgoMCwgcGF0dGVyblN0YXJ0IC0gKChpIC0gcGF0dGVyblN0YXJ0KSAvIDQpKSB8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBhdHRlcm5TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzRdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbmRlZChjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gY2hhckFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGNoYXJBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChjaGFyID49ICdhJyAmJiBjaGFyIDw9ICdkJykge1xuICAgICAgICAgICAgICAgIGlmIChpID4gKGxlbmd0aCAtIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNoYXJBcnJheVsrK2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IG5leHRDaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSA2NCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ0YnICYmIG5leHRDaGFyIDw9ICdKJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdLJyAmJiBuZXh0Q2hhciA8PSAnTycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnUCcgJiYgbmV4dENoYXIgPD0gJ1MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDQzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ1QnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdPJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID09PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92ZXJpZnlDaGVja3N1bXMoY2hhckFycmF5OiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAyLCAyMClcbiAgICAgICAgICAgICYmIHRoaXMuX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCAtIDEsIDE1KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4sIGluZGV4OiBudW1iZXIsIG1heFdlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFycmF5VG9DaGVjayA9IGNoYXJBcnJheS5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5VG9DaGVjay5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHdlaWdodGVkU3VtcyA9IGFycmF5VG9DaGVjay5yZWR1Y2UoKHN1bSwgY2hhciwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gKCgoaSAqIC0xKSArIChsZW5ndGggLSAxKSkgJSBtYXhXZWlnaHQpICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQUxQSEFCRVQuaW5kZXhPZihjaGFyLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgcmV0dXJuIHN1bSArICh3ZWlnaHQgKiB2YWx1ZSk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrQ2hhciA9IEFMUEhBQkVUWyh3ZWlnaHRlZFN1bXMgJSA0NyldO1xuICAgICAgICByZXR1cm4gY2hlY2tDaGFyID09PSBjaGFyQXJyYXlbaW5kZXhdLmNoYXJDb2RlQXQoMCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcbmltcG9ydCB7IEVBTlJlYWRlciB9IGZyb20gJy4vZWFuLXJlYWRlcic7XG5cbmV4cG9ydCBjbGFzcyBFQU4yUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3VwcGxlbWVudHMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICdlYW5fMic7XG4gICAgfVxuXG4gICAgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBsZXQgY29kZUZyZXF1ZW5jeSA9IDA7XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbztcblxuICAgICAgICB0aGlzLl9yb3cgPSByb3c7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gdGhpcy5DT0RFX0dfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDEgPDwgKDEgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIGNvZGUuZW5kKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93LCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggIT09IDIgfHwgKHBhcnNlSW50KHJlc3VsdC5qb2luKCcnKSkgJSA0KSAhPT0gY29kZUZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLFxuICAgICAgICAgICAgZW5kOiBjb2RlLmVuZFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBFQU5SZWFkZXIgfSBmcm9tICcuL2Vhbi1yZWFkZXInO1xuXG5leHBvcnQgY2xhc3MgRUFONVJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgZ2V0IENIRUNLX0RJR0lUX0VOQ09ESU5HUygpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIFsyNCwgMjAsIDE4LCAxNywgMTIsIDYsIDMsIDEwLCA5LCA1XTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3VwcGxlbWVudHMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICdlYW5fNSc7XG4gICAgfVxuXG4gICAgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbztcblxuICAgICAgICB0aGlzLl9yb3cgPSByb3c7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1ICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gdGhpcy5DT0RFX0dfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDEgPDwgKDQgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIGNvZGUuZW5kKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93LCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2V4dGVuc2lvbkNoZWNrc3VtKHJlc3VsdCkgIT09IHRoaXMuX2RldGVybWluZUNoZWNrRGlnaXQoY29kZUZyZXF1ZW5jeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3k6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSB0aGlzLkNIRUNLX0RJR0lUX0VOQ09ESU5HU1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2V4dGVuc2lvbkNoZWNrc3VtKHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IG51bWJlciB7XG4gICAgICAgIGxldCBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgICAgIH1cbiAgICAgICAgc3VtICo9IDM7XG4gICAgICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuICAgICAgICBzdW0gKj0gMztcblxuICAgICAgICByZXR1cm4gc3VtICUgMTA7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcbmltcG9ydCB7IEVBTlJlYWRlciB9IGZyb20gJy4vZWFuLXJlYWRlcic7XG5cbmV4cG9ydCBjbGFzcyBFQU44UmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3VwcGxlbWVudHMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICdlYW5fOCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvZGU6IEJhcmNvZGVJbmZvLCByZXN1bHQ6IEFycmF5PG51bWJlcj4sIGRlY29kZWRDb2RlczogQXJyYXk8QmFyY29kZUluZm8+KTogQmFyY29kZUluZm8ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIHRoaXMuQ09ERV9HX1NUQVJUKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29kZS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2ZpbmRQYXR0ZXJuKHRoaXMuTUlERExFX1BBVFRFUk4sIGNvZGUuZW5kLCAxLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCB0aGlzLkNPREVfR19TVEFSVCk7XG5cbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBtZXJnZSB9IGZyb20gJy4uL2NvbW1vbi9tZXJnZSc7XG5pbXBvcnQgeyBCYXJjb2RlLCBCYXJjb2RlSW5mbywgQmFyY29kZVJlYWRlciwgQmFyY29kZVJlYWRlckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuXG5jb25zdCBFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiA9IFsxLCAxLCAyXTtcbmNvbnN0IENPREVfUEFUVEVSTiA9IFtcbiAgICBbMywgMiwgMSwgMV0sXG4gICAgWzIsIDIsIDIsIDFdLFxuICAgIFsyLCAxLCAyLCAyXSxcbiAgICBbMSwgNCwgMSwgMV0sXG4gICAgWzEsIDEsIDMsIDJdLFxuICAgIFsxLCAyLCAzLCAxXSxcbiAgICBbMSwgMSwgMSwgNF0sXG4gICAgWzEsIDMsIDEsIDJdLFxuICAgIFsxLCAyLCAxLCAzXSxcbiAgICBbMywgMSwgMSwgMl0sXG4gICAgWzEsIDEsIDIsIDNdLFxuICAgIFsxLCAyLCAyLCAyXSxcbiAgICBbMiwgMiwgMSwgMl0sXG4gICAgWzEsIDEsIDQsIDFdLFxuICAgIFsyLCAzLCAxLCAxXSxcbiAgICBbMSwgMywgMiwgMV0sXG4gICAgWzQsIDEsIDEsIDFdLFxuICAgIFsyLCAxLCAzLCAxXSxcbiAgICBbMywgMSwgMiwgMV0sXG4gICAgWzIsIDEsIDEsIDNdXG5dO1xuY29uc3QgQ09ERV9GUkVRVUVOQ1kgPSBbMCwgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl07XG5cbmV4cG9ydCBjbGFzcyBFQU5SZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBnZXQgQ09ERV9MX1NUQVJUKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGdldCBDT0RFX0dfU1RBUlQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDEwO1xuICAgIH1cblxuICAgIGdldCBTVEFSVF9QQVRURVJOKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gWzEsIDEsIDFdO1xuICAgIH1cblxuICAgIGdldCBTVE9QX1BBVFRFUk4oKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBbMSwgMSwgMV07XG4gICAgfVxuXG4gICAgZ2V0IE1JRERMRV9QQVRURVJOKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gWzEsIDEsIDEsIDEsIDFdO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIobWVyZ2Uoe1xuICAgICAgICAgICAgc3VwcGxlbWVudHM6IFtdIC8vIEFsbG93ZWQgZXh0ZW5zaW9ucyB0byBiZSBkZWNvZGVkICgyIGFuZC9vciA1KVxuICAgICAgICB9LCBjb25maWcpLCBzdXBwbGVtZW50cyk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2Vhbl8xMyc7XG4gICAgICAgIHRoaXMuX3NpbmdsZUNvZGVFcnJvciA9IDAuNzA7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VDb2RlRXJyb3IgPSAwLjQ4O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShzdGFydDogbnVtYmVyLCBjb2RlcmFuZ2U/OiBudW1iZXIpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2g6IEJhcmNvZGVJbmZvID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZFUkFHRV9DT0RFX0VSUk9SO1xuICAgICAgICBsZXQgaXNXaGl0ZTogMCB8IDEgPSB0aGlzLl9yb3dbb2Zmc2V0XSA/IDAgOiAxO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgaWYgKCFjb2RlcmFuZ2UpIHtcbiAgICAgICAgICAgIGNvZGVyYW5nZSA9IENPREVfUEFUVEVSTi5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IGNvZGVyYW5nZTsgY29kZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBDT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmVycm9yID4gZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBzdGFydEluZm86IEJhcmNvZGVJbmZvO1xuXG4gICAgICAgIHdoaWxlICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUQVJUX1BBVFRFUk4sIG9mZnNldCwgMCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSAoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCk7XG5cbiAgICAgICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LCBzdGFydEluZm8uc3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpO1xuXG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kRW5kKG9mZnNldDogbnVtYmVyLCBpc1doaXRlOiAwIHwgMSk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKHRoaXMuU1RPUF9QQVRURVJOLCBvZmZzZXQsIGlzV2hpdGUsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2FsY3VsYXRlRmlyc3REaWdpdChjb2RlRnJlcXVlbmN5OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT0RFX0ZSRVFVRU5DWS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvZGVGcmVxdWVuY3kgPT09IENPREVfRlJFUVVFTkNZW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvZGU6IEJhcmNvZGVJbmZvLCByZXN1bHQ6IEFycmF5PG51bWJlcj4sIGRlY29kZWRDb2RlczogQXJyYXk8QmFyY29kZUluZm8+KTogQmFyY29kZUluZm8ge1xuICAgICAgICBsZXQgY29kZUZyZXF1ZW5jeSA9IDB4MDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZS5jb2RlIC09IHRoaXMuQ09ERV9HX1NUQVJUO1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoNSAtIGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDAgPDwgKDUgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0RGlnaXQgPSB0aGlzLl9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3kpO1xuXG4gICAgICAgIGlmIChmaXJzdERpZ2l0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KGZpcnN0RGlnaXQpO1xuXG4gICAgICAgIGNvZGUgPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLk1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgMSwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlLmVuZCwgdGhpcy5DT0RFX0dfU1RBUlQpO1xuXG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBjb25zdCBkZWNvZGVkQ29kZXMgPSBuZXcgQXJyYXk8QmFyY29kZUluZm8+KCk7XG4gICAgICAgIGxldCByZXN1bHRJbmZvOiBCYXJjb2RlID0ge307XG4gICAgICAgIGxldCBzdGFydEluZm8gPSB0aGlzLl9maW5kU3RhcnQoKTtcblxuICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm8gPSB7XG4gICAgICAgICAgICBjb2RlOiBzdGFydEluZm8uY29kZSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0SW5mby5lbmRcbiAgICAgICAgfTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZVBheWxvYWQoY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gdGhpcy5fZmluZEVuZChjb2RlLmVuZCwgMCk7XG5cbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuXG4gICAgICAgIC8vIENoZWNrc3VtXG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tzdW0ocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdXBwbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdXBwbGVtZW50ID0gdGhpcy5fZGVjb2RlRXh0ZW5zaW9ucyhjb2RlLmVuZCk7XG4gICAgICAgICAgICBpZiAoIXN1cHBsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGFzdENvZGUgPSBzdXBwbGVtZW50LmRlY29kZWRDb2Rlc1tzdXBwbGVtZW50LmRlY29kZWRDb2Rlcy5sZW5ndGggLSAxXSBhcyBCYXJjb2RlSW5mbztcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGxhc3RDb2RlLnN0YXJ0ICsgKCgobGFzdENvZGUuZW5kIC0gbGFzdENvZGUuc3RhcnQpIC8gMikgfCAwKSxcbiAgICAgICAgICAgICAgICBlbmQ6IGxhc3RDb2RlLmVuZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0SW5mbyA9IHtcbiAgICAgICAgICAgICAgICBzdXBwbGVtZW50LFxuICAgICAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSArIHN1cHBsZW1lbnQuY29kZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBjb2RlLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIC4uLnJlc3VsdEluZm9cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbnNpb25zKG9mZnNldDogbnVtYmVyKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOLCBzdGFydCwgMCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChzdGFydEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5zdXBwbGVtZW50c1tpXS5kZWNvZGUodGhpcy5fcm93LCBzdGFydEluZm8uZW5kKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiByZXN1bHQuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiByZXN1bHQuZW5kLFxuICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ29kZXM6IHJlc3VsdC5kZWNvZGVkQ29kZXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaGVja3N1bShyZXN1bHQ6IEFycmF5PG51bWJlcj4pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1bSAqPSAzO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSByZXN1bHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtICUgMTAgPT09IDA7XG4gICAgfVxufSIsImltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi4vY29tbW9uL21lcmdlJztcbmltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IE4gPSAxO1xuY29uc3QgVyA9IDM7XG5jb25zdCBTVEFSVF9QQVRURVJOID0gW04sIE4sIE4sIE5dO1xuY29uc3QgU1RPUF9QQVRURVJOID0gW04sIE4sIFddO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFtOLCBOLCBXLCBXLCBOXSxcbiAgICBbVywgTiwgTiwgTiwgV10sXG4gICAgW04sIFcsIE4sIE4sIFddLFxuICAgIFtXLCBXLCBOLCBOLCBOXSxcbiAgICBbTiwgTiwgVywgTiwgV10sXG4gICAgW1csIE4sIFcsIE4sIE5dLFxuICAgIFtOLCBXLCBXLCBOLCBOXSxcbiAgICBbTiwgTiwgTiwgVywgV10sXG4gICAgW1csIE4sIE4sIFcsIE5dLFxuICAgIFtOLCBXLCBOLCBXLCBOXVxuXTtcbmNvbnN0IE1BWF9DT1JSRUNUSU9OX0ZBQ1RPUiA9IDU7XG5cbmV4cG9ydCBjbGFzcyBJMm9mNVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByaXZhdGUgX2JhclNwYWNlUmF0aW86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnKSB7XG4gICAgICAgIHN1cGVyKG1lcmdlKHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZUJhclNwYWNlV2lkdGg6IGZhbHNlIC8vIE5vcm1hbGl6ZSB0aGUgd2lkdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGJhcnMgYW5kIHNwYWNlc1xuICAgICAgICB9LCBjb25maWcpKTtcblxuICAgICAgICB0aGlzLl9iYXJTcGFjZVJhdGlvID0gWzEsIDFdO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnaTJvZjUnO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9zaW5nbGVDb2RlRXJyb3IgPSAwLjM4O1xuICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUNvZGVFcnJvciA9IDAuMDk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zaW5nbGVDb2RlRXJyb3IgPSAwLjc4O1xuICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUNvZGVFcnJvciA9IDAuMzg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kRW5kKCk7XG5cbiAgICAgICAgaWYgKCFlbmRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50ZXJzID0gdGhpcy5fZmlsbENvdW50ZXJzKHN0YXJ0SW5mby5lbmQsIGVuZEluZm8uc3RhcnQsIDApO1xuXG4gICAgICAgIGlmIChjb3VudGVycy5sZW5ndGggJSAxMCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBjb25zdCBkZWNvZGVkQ29kZXMgPSBuZXcgQXJyYXk8QmFyY29kZUluZm8+KCk7XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goc3RhcnRJbmZvKTtcblxuICAgICAgICBjb25zdCBjb2RlID0gdGhpcy5fZGVjb2RlUGF5bG9hZChjb3VudGVycywgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuXG4gICAgICAgIGlmICghY29kZSB8fCByZXN1bHQubGVuZ3RoICUgMiAhPT0gMCB8fCByZXN1bHQubGVuZ3RoIDwgNikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChlbmRJbmZvKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kSW5mby5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21hdGNoUGF0dGVybihjb3VudGVyOiBBcnJheTxudW1iZXI+LCBjb2RlOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5jb25maWcubm9ybWFsaXplQmFyU3BhY2VXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgY291bnRlclN1bTogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVTdW06IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0aW9uOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvblJhdGlvID0gTUFYX0NPUlJFQ1RJT05fRkFDVE9SO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvblJhdGlvSW52ZXJzZSA9IDEgLyBjb3JyZWN0aW9uUmF0aW87XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJTdW1baSAlIDJdICs9IGNvdW50ZXJbaV07XG4gICAgICAgICAgICAgICAgY29kZVN1bVtpICUgMl0gKz0gY29kZVtpXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29ycmVjdGlvblswXSA9IGNvZGVTdW1bMF0gLyBjb3VudGVyU3VtWzBdO1xuICAgICAgICAgICAgY29ycmVjdGlvblsxXSA9IGNvZGVTdW1bMV0gLyBjb3VudGVyU3VtWzFdO1xuXG4gICAgICAgICAgICBjb3JyZWN0aW9uWzBdID0gTWF0aC5tYXgoTWF0aC5taW4oY29ycmVjdGlvblswXSwgY29ycmVjdGlvblJhdGlvKSwgY29ycmVjdGlvblJhdGlvSW52ZXJzZSk7XG4gICAgICAgICAgICBjb3JyZWN0aW9uWzFdID0gTWF0aC5tYXgoTWF0aC5taW4oY29ycmVjdGlvblsxXSwgY29ycmVjdGlvblJhdGlvKSwgY29ycmVjdGlvblJhdGlvSW52ZXJzZSk7XG4gICAgICAgICAgICB0aGlzLl9iYXJTcGFjZVJhdGlvID0gY29ycmVjdGlvbjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpXSAqPSB0aGlzLl9iYXJTcGFjZVJhdGlvW2kgJSAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIGNvZGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbzogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUQVJUX1BBVFRFUk4sIG9mZnNldCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuYXJyb3dCYXJXaWR0aCA9IChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KSA+PiAyO1xuICAgICAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIG5hcnJvd0JhcldpZHRoICogMTA7XG5cbiAgICAgICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LCBzdGFydEluZm8uc3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMjtcblxuICAgICAgICBpZiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZCgpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUT1BfUEFUVEVSTiwgdW5kZWZpbmVkLCAwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fcm93LnJldmVyc2UoKTtcblxuICAgICAgICBpZiAoZW5kSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXZlcnNlIG51bWJlcnNcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBlbmRJbmZvLnN0YXJ0O1xuICAgICAgICBlbmRJbmZvLnN0YXJ0ID0gdGhpcy5fcm93Lmxlbmd0aCAtIGVuZEluZm8uZW5kO1xuICAgICAgICBlbmRJbmZvLmVuZCA9IHRoaXMuX3Jvdy5sZW5ndGggLSBzdGFydDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKGNvdW50ZXI6IEFycmF5PG51bWJlcj4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaDogQmFyY29kZUluZm8gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IENPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2guZXJyb3IgPCB0aGlzLkFWRVJBR0VfQ09ERV9FUlJPUiA/IGJlc3RNYXRjaCA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbz4pOiBbQmFyY29kZUluZm8sIEJhcmNvZGVJbmZvXSB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIwID0gWzAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBjb3VudGVyMSA9IFswLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgbGV0IGNvZGUwOiBCYXJjb2RlSW5mbztcbiAgICAgICAgbGV0IGNvZGUxOiBCYXJjb2RlSW5mbztcbiAgICAgICAgbGV0IHBvcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcjBbaV0gPSBjb3VudGVyc1twb3NdICogdGhpcy5fYmFyU3BhY2VSYXRpb1swXTtcbiAgICAgICAgICAgICAgICBjb3VudGVyMVtpXSA9IGNvdW50ZXJzW3BvcyArIDFdICogdGhpcy5fYmFyU3BhY2VSYXRpb1sxXTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29kZTAgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXIwKTtcbiAgICAgICAgICAgIGlmICghY29kZTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXIxKTtcbiAgICAgICAgICAgIGlmICghY29kZTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29kZTAuY29kZSwgY29kZTEuY29kZSk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlMCwgY29kZTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjb2RlMCwgY29kZTFdO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvZGUxMjhSZWFkZXIgfSBmcm9tICcuL2NvZGUtMTI4LXJlYWRlcic7XG5pbXBvcnQgeyBDb2RlMzlSZWFkZXIgfSBmcm9tICcuL2NvZGUtMzktcmVhZGVyJztcbmltcG9ydCB7IENvZGUzOVZJTlJlYWRlciB9IGZyb20gJy4vY29kZS0zOS12aW4tcmVhZGVyJztcbmltcG9ydCB7IENvZGFiYXJSZWFkZXIgfSBmcm9tICcuL2NvZGFiYXItcmVhZGVyJztcbmltcG9ydCB7IEVBTlJlYWRlciB9IGZyb20gJy4vZWFuLXJlYWRlcic7XG5pbXBvcnQgeyBFQU44UmVhZGVyIH0gZnJvbSAnLi9lYW4tOC1yZWFkZXInO1xuaW1wb3J0IHsgRUFOMlJlYWRlciB9IGZyb20gJy4vZWFuLTItcmVhZGVyJztcbmltcG9ydCB7IEVBTjVSZWFkZXIgfSBmcm9tICcuL2Vhbi01LXJlYWRlcic7XG5pbXBvcnQgeyBVUENSZWFkZXIgfSBmcm9tICcuL3VwYy1yZWFkZXInO1xuaW1wb3J0IHsgVVBDRVJlYWRlciB9IGZyb20gJy4vdXBjLWUtcmVhZGVyJztcbmltcG9ydCB7IEkyb2Y1UmVhZGVyIH0gZnJvbSAnLi9pMm9mNS1yZWFkZXInO1xuaW1wb3J0IHsgVHdvT2ZGaXZlUmVhZGVyIH0gZnJvbSAnLi8yb2Y1LXJlYWRlcic7XG5pbXBvcnQgeyBDb2RlOTNSZWFkZXIgfSBmcm9tICcuL2NvZGUtOTMtcmVhZGVyJztcblxuZXhwb3J0IGNvbnN0IFJlYWRlcnMgPSB7XG4gICAgY29kZV8xMjhfcmVhZGVyOiBDb2RlMTI4UmVhZGVyLFxuICAgIGVhbl9yZWFkZXI6IEVBTlJlYWRlcixcbiAgICBlYW5fNV9yZWFkZXI6IEVBTjVSZWFkZXIsXG4gICAgZWFuXzJfcmVhZGVyOiBFQU4yUmVhZGVyLFxuICAgIGVhbl84X3JlYWRlcjogRUFOOFJlYWRlcixcbiAgICBjb2RlXzM5X3JlYWRlcjogQ29kZTM5UmVhZGVyLFxuICAgIGNvZGVfMzlfdmluX3JlYWRlcjogQ29kZTM5VklOUmVhZGVyLFxuICAgIGNvZGFiYXJfcmVhZGVyOiBDb2RhYmFyUmVhZGVyLFxuICAgIHVwY19yZWFkZXI6IFVQQ1JlYWRlcixcbiAgICB1cGNfZV9yZWFkZXI6IFVQQ0VSZWFkZXIsXG4gICAgaTJvZjVfcmVhZGVyOiBJMm9mNVJlYWRlcixcbiAgICAnMm9mNV9yZWFkZXInOiBUd29PZkZpdmVSZWFkZXIsXG4gICAgY29kZV85M19yZWFkZXI6IENvZGU5M1JlYWRlclxufTtcbiIsImltcG9ydCB7IEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBFQU5SZWFkZXIgfSBmcm9tICcuL2Vhbi1yZWFkZXInO1xuXG5jb25zdCBDT0RFX0ZSRVFVRU5DWSA9IFtbNTYsIDUyLCA1MCwgNDksIDQ0LCAzOCwgMzUsIDQyLCA0MSwgMzddLCBbNywgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl1dO1xuXG5leHBvcnQgY2xhc3MgVVBDRVJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgZ2V0IFNUT1BfUEFUVEVSTigpIHtcbiAgICAgICAgcmV0dXJuIFsxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3XTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3VwcGxlbWVudHMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICd1cGNfZSc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvZGU6IEJhcmNvZGVJbmZvLCByZXN1bHQ6IEFycmF5PG51bWJlcj4sIGRlY29kZWRDb2RlczogQXJyYXk8QmFyY29kZUluZm8+KTogQmFyY29kZUluZm8ge1xuICAgICAgICBsZXQgY29kZUZyZXF1ZW5jeSA9IDB4MDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZS5jb2RlID0gY29kZS5jb2RlIC0gdGhpcy5DT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg1IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5LCByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5OiBudW1iZXIsIHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBuclN5c3RlbSA9IDA7IG5yU3lzdGVtIDwgQ09ERV9GUkVRVUVOQ1kubGVuZ3RoOyBuclN5c3RlbSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZW25yU3lzdGVtXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDT0RFX0ZSRVFVRU5DWVtuclN5c3RlbV1baV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQobnJTeXN0ZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb252ZXJ0VG9VUENBKHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDJdO1xuICAgICAgICBsZXQgdXBjYSA9IFtyZXN1bHRbMF1dO1xuXG4gICAgICAgIGlmIChsYXN0RGlnaXQgPD0gMikge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCAzKSkuY29uY2F0KFtsYXN0RGlnaXQsIDAsIDAsIDAsIDBdKS5jb25jYXQocmVzdWx0LnNsaWNlKDMsIDYpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDMpIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNCkpLmNvbmNhdChbMCwgMCwgMCwgMCwgMF0pLmNvbmNhdChyZXN1bHQuc2xpY2UoNCwgNikpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNCkge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA1KSkuY29uY2F0KFswLCAwLCAwLCAwLCAwLCByZXN1bHRbNV1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNikpLmNvbmNhdChbMCwgMCwgMCwgMCwgbGFzdERpZ2l0XSk7XG4gICAgICAgIH1cblxuICAgICAgICB1cGNhLnB1c2gocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSk7XG4gICAgICAgIHJldHVybiB1cGNhO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5fY2hlY2tzdW0odGhpcy5fY29udmVydFRvVVBDQShyZXN1bHQpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQob2Zmc2V0OiBudW1iZXIsIGlzV2hpdGU6IDAgfCAxKSB7XG4gICAgICAgIGlzV2hpdGUgPSAxO1xuICAgICAgICByZXR1cm4gc3VwZXIuX2ZpbmRFbmQob2Zmc2V0LCBpc1doaXRlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvOiBCYXJjb2RlSW5mbyk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoZW5kSW5mby5lbmQgLSBlbmRJbmZvLnN0YXJ0KSAvIDI7XG5cbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHRoaXMuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZVJlYWRlciwgQmFyY29kZVJlYWRlckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuaW1wb3J0IHsgRUFOUmVhZGVyIH0gZnJvbSAnLi9lYW4tcmVhZGVyJztcblxuZXhwb3J0IGNsYXNzIFVQQ1JlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnPzogQmFyY29kZVJlYWRlckNvbmZpZywgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyPikge1xuICAgICAgICBzdXBlcihjb25maWcsIHN1cHBsZW1lbnRzKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAndXBjX2EnO1xuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVjb2RlKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY29kZSAmJiByZXN1bHQuY29kZS5sZW5ndGggPT09IDEzICYmIHJlc3VsdC5jb2RlLmNoYXJBdCgwKSA9PT0gJzAnKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IHJlc3VsdC5jb2RlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/dist/quagga.min.js b/dist/quagga.min.js
index f7a30f41..69987eba 100644
--- a/dist/quagga.min.js
+++ b/dist/quagga.min.js
@@ -1 +1 @@
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(e.toString()).default:"object"==typeof exports?exports.Quagga=e(e.toString()).default:t.Quagga=e(e.toString()).default}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/",e(e.s=166)}([function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){"use strict";function r(t,e){return this._row=[],this.config=t||{},this.supplements=e,this}var o=n(3);r.prototype._nextUnset=function(t,e){var n;for(void 0===e&&(e=0),n=e;nn)return Number.MAX_VALUE;u+=c}return u/f},r.prototype._nextSet=function(t,e){var n;for(e=e||0,n=e;n1&&(t[n[r]]=o)},r.prototype._matchTrace=function(t,e){var n,r,o=[],i=this,a=i._nextSet(i._row),u=!i._row[a],c=0,s={error:Number.MAX_VALUE,code:-1,start:0};if(t){for(n=0;n=0;r--)e=Math.floor(Math.random()*r),n=t[r],t[r]=t[e],t[e]=n;return t},toPointList:function(t){var e,n,r=[],o=[];for(e=0;e=e&&o.push(t[r]);return o},maxIndex:function(t){var e,n=0;for(e=0;et[n]&&(n=e);return n},max:function t(e){var n,t=0;for(n=0;nt&&(t=e[n]);return t},sum:function t(e){for(var n=e.length,t=0;n--;)t+=e[n];return t}}},function(t,e,n){"use strict";function r(t,e){t=a()(o(),t),u.a.call(this,t,e)}function o(){var t={};return Object.keys(r.CONFIG_KEYS).forEach(function(e){t[e]=r.CONFIG_KEYS[e].default}),t}var i=n(28),a=n.n(i),u=n(1),c=Object.assign||function(t){for(var e=1;ea.AVG_CODE_ERROR?null:f}s++,i[s]=1,c=!c}return null},r.prototype._findPattern=function(t,e,n,r,o){var i,a,u,c,s=[],f=this,l=0,d={error:Number.MAX_VALUE,code:-1,start:0,end:0};for(e||(e=f._nextSet(f._row)),void 0===n&&(n=!1),void 0===r&&(r=!0),void 0===o&&(o=f.AVG_CODE_ERROR),i=0;i=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start),e=i.CODE_G_START?(t.code=t.code-i.CODE_G_START,a|=1<<5-r):a|=0<<5-r,e.push(t.code),n.push(t)}if(null===(o=i._calculateFirstDigit(a)))return null;if(e.unshift(o),null===(t=i._findPattern(i.MIDDLE_PATTERN,t.end,!0,!1)))return null;for(n.push(t),r=0;r<6;r++){if(!(t=i._decodeCode(t.end,i.CODE_G_START)))return null;n.push(t),e.push(t.code)}return t},r.prototype._decode=function(){var t,e,n=this,r=[],o=[],i={};if(!(t=n._findStart()))return null;if(e={code:t.code,start:t.start,end:t.end},o.push(e),!(e=n._decodePayload(e,r,o)))return null;if(!(e=n._findEnd(e.end,!1)))return null;if(o.push(e),!n._checksum(r))return null;if(this.supplements.length>0){var a=this._decodeExtensions(e.end);if(!a)return null;var u=a.decodedCodes[a.decodedCodes.length-1],s={start:u.start+((u.end-u.start)/2|0),end:u.end};if(!n._verifyTrailingWhitespace(s))return null;i={supplement:a,code:r.join("")+a.code}}return c({code:r.join(""),start:t.start,end:e.end,codeset:"",startInfo:t,decodedCodes:o},i)},r.prototype._decodeExtensions=function(t){var e,n,r=this._nextSet(this._row,t),o=this._findPattern(this.EXTENSION_START_PATTERN,r,!1,!1);if(null===o)return null;for(e=0;e=0;e-=2)n+=t[e];for(n*=3,e=t.length-1;e>=0;e-=2)n+=t[e];return n%10==0},r.CONFIG_KEYS={supplements:{type:"arrayOf(string)",default:[],description:"Allowed extensions to be decoded (2 and/or 5)"}},e.a=r},function(t,e,n){var r=n(38),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){function n(t){return null!=t&&"object"==typeof t}t.exports=n},function(t,e){function n(t){var e=new Float32Array(2);return e[0]=t[0],e[1]=t[1],e}t.exports=n},function(t,e,n){function r(t){return null==t?void 0===t?c:u:s&&s in Object(t)?i(t):a(t)}var o=n(11),i=n(119),a=n(146),u="[object Null]",c="[object Undefined]",s=o?o.toStringTag:void 0;t.exports=r},function(t,e,n){"use strict";e.a={drawRect:function(t,e,n,r){n.strokeStyle=r.color,n.fillStyle=r.color,n.lineWidth=1,n.beginPath(),n.strokeRect(t.x,t.y,e.x,e.y)},drawPath:function(t,e,n,r){n.strokeStyle=r.color,n.fillStyle=r.color,n.lineWidth=r.lineWidth,n.beginPath(),n.moveTo(t[0][e.x],t[0][e.y]);for(var o=1;o-1&&t%1==0&&t0?Math.floor(this.x+.5):Math.floor(this.x-.5),this.y=this.y>0?Math.floor(this.y+.5):Math.floor(this.y-.5),this}}}function o(t,e,n){n||(n=t);for(var r=t.data,o=r.length,i=n.data;o--;)i[o]=r[o]>o]++;return a}function a(t,e){function n(t,e){var n,r=0;for(n=t;n<=e;n++)r+=a[n];return r}function r(t,e){var n,r=0;for(n=t;n<=e;n++)r+=n*a[n];return r}function o(){var o,u,c,s,f,l,d,h=[0],p=(1<c)for(i=s[u],i.score=o,i.item=t[r],c=Number.MAX_VALUE,a=0;ae[r]?r++:n++;return o}function _(t,e){function n(t){for(var e=0,n=t[Math.floor(t.length/2)];e0&&(n=Math.abs(t[e]-d)>Math.abs(t[e-1]-d)?t[e-1]:t[e]),d/nc[f-1]/c[f]?{x:n,y:n}:null}var r,o=p(e.x),i=p(e.y),a=Math.max(e.x,e.y),u=v(o,i),c=[8,10,15,20,32,60,80],s={"x-small":5,small:4,medium:3,large:2,"x-large":1},f=s[t]||s.medium,l=c[f],d=Math.floor(a/l);return r=n(u),r||(r=n(p(a)))||(r=n(p(d*l))),r}function g(t){return{value:parseFloat(t),unit:(t.indexOf("%"),t.length,"%")}}function y(t,e,n){var r={width:t,height:e},o=Object.keys(n).reduce(function(t,e){var o=n[e],i=g(o),a=C[e](i,r);return t[e]=a,t},{});return{sx:o.left,sy:o.top,sw:o.right-o.left,sh:o.bottom-o.top}}var m=n(50),x=n(3);e.b=r,e.f=u,e.g=c,e.h=s,e.c=f,e.d=l,e.i=d,e.a=h,e.e=_,e.j=y;var b={clone:n(7)},E={clone:n(83)},C={top:function(t,e){if("%"===t.unit)return Math.floor(e.height*(t.value/100))},right:function(t,e){if("%"===t.unit)return Math.floor(e.width-e.width*(t.value/100))},bottom:function(t,e){if("%"===t.unit)return Math.floor(e.height-e.height*(t.value/100))},left:function(t,e){if("%"===t.unit)return Math.floor(e.width*(t.value/100))}}},function(t,e,n){"use strict";function r(t,e,n,r){e?this.data=e:n?(this.data=new n(t.x*t.y),n===Array&&r&&a.a.init(this.data,0)):(this.data=new Uint8Array(t.x*t.y),Uint8Array===Array&&r&&a.a.init(this.data,0)),this.size=t}var o=n(53),i=n(19),a=n(3),u={clone:n(7)};r.prototype.inImageWithBorder=function(t,e){return t.x>=e&&t.y>=e&&t.x0&&(a=g[r-1],a.m00+=1,a.m01+=n,a.m10+=e,a.m11+=e*n,a.m02+=o,a.m20+=e*e);for(i=0;i=0?x:-x)+m,a.theta=(180*h/m+90)%180-90,a.theta<0&&(a.theta+=180),a.rad=h>m?h-m:h,a.vec=u.clone([Math.cos(h),Math.sin(h)]),y.push(a));return y},r.prototype.show=function(t,e){var n,r,o,i,a,u,c;for(e||(e=1),n=t.getContext("2d"),t.width=this.size.x,t.height=this.size.y,r=n.getImageData(0,0,t.width,t.height),o=r.data,i=0,c=0;c360)&&(e=360);for(var o=[0,1,1],a=[0,0,0],u=[255,255,255],c=[0,0,0],s=[],f=t.getContext("2d"),l=f.getImageData(r.x,r.y,this.size.x,this.size.y),d=l.data,h=this.data.length;h--;)o[0]=this.data[h]*e,s=o[0]<=0?u:o[0]>=360?c:n.i(i.a)(o,a),d[4*h+0]=s[0],d[4*h+1]=s[1],d[4*h+2]=s[2],d[4*h+3]=255;f.putImageData(l,r.x,r.y)},e.a=r},function(t,e,n){function r(t,e,n){"__proto__"==e&&o?o(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}var o=n(37);t.exports=r},function(t,e,n){function r(t,e){var n=i(t,e);return o(n)?n:void 0}var o=n(97),i=n(120);t.exports=r},function(t,e,n){function r(t){if("string"==typeof t||o(t))return t;var e=t+"";return"0"==e&&1/t==-i?"-0":e}var o=n(27),i=1/0;t.exports=r},function(t,e,n){function r(t){return null!=t&&i(t.length)&&!o(t)}var o=n(25),i=n(26);t.exports=r},function(t,e,n){function r(t){if(!i(t))return!1;var e=o(t);return e==u||e==c||e==a||e==s}var o=n(8),i=n(0),a="[object AsyncFunction]",u="[object Function]",c="[object GeneratorFunction]",s="[object Proxy]";t.exports=r},function(t,e){function n(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=r}var r=9007199254740991;t.exports=n},function(t,e,n){function r(t){return"symbol"==typeof t||i(t)&&o(t)==a}var o=n(8),i=n(6),a="[object Symbol]";t.exports=r},function(t,e,n){var r=n(100),o=n(116),i=o(function(t,e,n){r(t,e,n)});t.exports=i},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";var r={searchDirections:[[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1]],create:function(t,e){function n(t,e,n,r){var o,f,l;for(o=0;o<7;o++){if(f=t.cy+c[t.dir][0],l=t.cx+c[t.dir][1],i=f*s+l,a[i]===e&&(0===u[i]||u[i]===n))return u[i]=n,t.cy=f,t.cx=l,!0;0===u[i]&&(u[i]=r),t.dir=(t.dir+1)%8}return!1}function r(t,e,n){return{dir:n,x:t,y:e,next:null,prev:null}}function o(t,e,o,i,a){var u,c,s,f=null,l={cx:e,cy:t,dir:0};if(n(l,i,o,a)){f=r(e,t,l.dir),u=f,s=l.dir,c=r(l.cx,l.cy,0),c.prev=u,u.next=c,c.next=null,u=c;do l.dir=(l.dir+6)%8,n(l,i,o,a),s!==l.dir?(u.dir=l.dir,c=r(l.cx,l.cy,0),c.prev=u,u.next=c,c.next=null,u=c):(u.dir=s,u.x=l.cx,u.y=l.cy),s=l.dir;while(l.cx!==e||l.cy!==t);f.prev=u.prev,u.prev.next=f}return f}var i,a=t.data,u=e.data,c=this.searchDirections,s=t.size.x;return{trace:function(t,e,r,o){return n(t,e,r,o)},contourTracing:function(t,e,n,r,i){return o(t,e,n,r,i)}}}};e.a=r},function(t,e,n){"use strict";function r(){o.a.call(this)}var o=n(1),i=n(3),a={ALPHABETH_STRING:{value:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"},ALPHABET:{value:[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,45,46,32,42,36,47,43,37]},CHARACTER_ENCODINGS:{value:[52,289,97,352,49,304,112,37,292,100,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,148,168,162,138,42]},ASTERISK:{value:148},FORMAT:{value:"code_39",writeable:!1}};r.prototype=Object.create(o.a.prototype,a),r.prototype.constructor=r,r.prototype._decode=function(){var t,e,n,r,o=this,a=[0,0,0,0,0,0,0,0,0],u=[],c=o._findStart();if(!c)return null;r=o._nextSet(o._row,c.end);do{if(a=o._toCounters(r,a),(n=o._toPattern(a))<0)return null;if((t=o._patternToChar(n))<0)return null;u.push(t),e=r,r+=i.a.sum(a),r=o._nextSet(o._row,r)}while("*"!==t);return u.pop(),u.length&&o._verifyTrailingWhitespace(e,r,a)?{code:u.join(""),start:c.start,end:r,startInfo:c,decodedCodes:u}:null},r.prototype._verifyTrailingWhitespace=function(t,e,n){var r=i.a.sum(n);return 3*(e-t-r)>=r},r.prototype._patternToChar=function(t){var e,n=this;for(e=0;ee&&(r=t[n]);return r},r.prototype._toPattern=function(t){for(var e,n,r=t.length,o=0,i=r,a=0,u=this;i>3;){for(o=u._findNextWidth(t,o),i=0,e=0,n=0;no&&(e|=1<0;n++)if(t[n]>o&&(i--,2*t[n]>=a))return-1;return e}}return-1},r.prototype._findStart=function(){var t,e,n,r=this,o=r._nextSet(r._row),i=o,a=[0,0,0,0,0,0,0,0,0],u=0,c=!1;for(t=o;t0)for(r=0;r0){if(!(t=Y.filter(function(t){return!t.busy})[0]))return;w.attachData(t.imageData)}else w.attachData(S.data);w.grab()&&(t?(t.busy=!0,t.worker.postMessage({cmd:"process",imageData:t.imageData},[t.imageData.buffer])):_())}else _()}function y(){var t=null,e=1e3/($.frequency||60);T=!1,function n(r){t=t||r,T||(r>=t&&(t+=e,g()),window.requestAnimFrame(n))}(performance.now())}function m(){Q&&"LiveStream"===$.inputStream.type?y():g()}function x(t){var e,n={worker:void 0,imageData:new Uint8Array(R.getWidth()*R.getHeight()),busy:!0};e=C(),n.worker=new Worker(e),n.worker.onmessage=function(r){if("initialized"===r.data.event)return URL.revokeObjectURL(e),n.busy=!1,n.imageData=new Uint8Array(r.data.imageData),t(n);"processed"===r.data.event?(n.imageData=new Uint8Array(r.data.imageData),n.busy=!1,v(r.data.result,n.imageData)):r.data.event},n.worker.postMessage({cmd:"init",size:{x:R.getWidth(),y:R.getHeight()},imageData:n.imageData,config:b($)},[n.imageData.buffer])}function b(t){return X({},t,{inputStream:X({},t.inputStream,{target:null})})}function E(t){function e(t){self.postMessage({event:"processed",imageData:o.data,result:t},[o.data.buffer])}function n(){self.postMessage({event:"initialized",imageData:o.data},[o.data.buffer])}if(t){var r=t().default;if(!r)return void self.postMessage({event:"error",message:"Quagga could not be created"})}var o;self.onmessage=function(t){if("init"===t.data.cmd){var i=t.data.config;i.numOfWorkers=0,o=new r.ImageWrapper({x:t.data.size.x,y:t.data.size.y},new Uint8Array(t.data.imageData)),r.init(i,n,o),r.onProcessed(e)}else"process"===t.data.cmd?(o.data=new Uint8Array(t.data.imageData),r.start()):"setReaders"===t.data.cmd&&r.setReaders(t.data.readers)}}function C(){var e,n;return void 0!==t&&(n=t),e=new Blob(["("+E.toString()+")("+n+");"],{type:"text/javascript"}),window.URL.createObjectURL(e)}function O(t){P?P.setReaders(t):Q&&Y.length>0&&Y.forEach(function(e){e.worker.postMessage({cmd:"setReaders",readers:t})})}function A(t,e){var n=t-Y.length;if(0===n)return e&&e();if(n<0){return Y.slice(n).forEach(function(t){t.worker.terminate()}),Y=Y.slice(0,n),e&&e()}for(var r=function(n){Y.push(n),Y.length>=t&&e&&e()},o=0;oe},getPoints:function(){return a},getCenter:function(){return u}}},createPoint:function(t,e,n){return{rad:t[n],point:t,id:e}}}},function(t,e,n){"use strict";e.a=function(){function t(t){return o[t]||(o[t]={subscribers:[]}),o[t]}function e(){o={}}function n(t,e){t.async?setTimeout(function(){t.callback(e)},4):t.callback(e)}function r(e,n,r){var o;if("function"==typeof n)o={callback:n,async:r};else if(o=n,!o.callback)throw"Callback was not specified on options";t(e).subscribers.push(o)}var o={};return{subscribe:function(t,e,n){return r(t,e,n)},publish:function(e,r){var o=t(e),i=o.subscribers;i.filter(function(t){return!!t.once}).forEach(function(t){n(t,r)}),o.subscribers=i.filter(function(t){return!t.once}),o.subscribers.forEach(function(t){n(t,r)})},once:function(t,e,n){r(t,{callback:e,async:n,once:!0})},unsubscribe:function(n,r){var o;n?(o=t(n),o.subscribers=o&&r?o.subscribers.filter(function(t){return t.callback!==r}):[]):e()}}}()},function(t,e,n){"use strict";function r(){return navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.enumerateDevices?navigator.mediaDevices.enumerateDevices():Promise.reject(new Error("enumerateDevices is not defined"))}function o(t){return navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.getUserMedia?navigator.mediaDevices.getUserMedia(t):Promise.reject(new Error("getUserMedia is not defined"))}e.b=r,e.a=o},function(t,e,n){"use strict";function r(t,e,n){n||(n={data:null,size:e}),this.data=n.data,this.originalSize=n.size,this.I=n,this.from=t,this.size=e}r.prototype.show=function(t,e){var n,r,o,i,a,u,c;for(e||(e=1),n=t.getContext("2d"),t.width=this.size.x,t.height=this.size.y,r=n.getImageData(0,0,t.width,t.height),o=r.data,i=0,a=0;a>>16&65535,r=65535&t,o=e>>>16&65535,i=65535&e;return r*i+(n*i+r*o<<16>>>0)|0},"function"!=typeof Object.assign&&(Object.assign=function(t){"use strict";if(null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n1&&(!e.inImageWithBorder(t[0],0)||!e.inImageWithBorder(t[1],0));)r-=Math.ceil(r/2),o(-r);return t}function u(t){return[{x:(t[1][0]-t[0][0])/2+t[0][0],y:(t[1][1]-t[0][1])/2+t[0][1]},{x:(t[3][0]-t[2][0])/2+t[2][0],y:(t[3][1]-t[2][1])/2+t[2][1]}]}function c(t){var n,o=null,i=r.a.getBarcodeLine(e,t[0],t[1]);for(r.a.toBinaryLine(i),n=0;nE?l:E,g.push(l)}var o,i,a,u,c,s,f,l,d=0|e.x,h=0|e.y,p=0|n.x,v=0|n.y,_=Math.abs(v-h)>Math.abs(p-d),g=[],y=t.data,m=t.size.x,x=0,b=255,E=0;for(_&&(s=d,d=h,h=s,s=p,p=v,v=s),d>p&&(s=d,d=p,p=s,s=h,h=v,v=s),o=p-d,i=Math.abs(v-h),a=o/2|0,c=h,u=hl?o.DIR.UP:o.DIR.DOWN,d.push({pos:0,val:f[0]}),a=0;ah&&f[a+1]>.5*l?o.DIR.UP:r,r!==i&&(d.push({pos:a,val:f[a]}),r=i);for(d.push({pos:f.length,val:f[f.length-1]}),u=d[0].pos;ul?0:1;for(a=1;ad[a].val?d[a].val+(d[a+1].val-d[a].val)/3*2|0:d[a+1].val+(d[a].val-d[a+1].val)/3|0,u=d[a].pos;uh?0:1;return{line:f,threshold:h}},r.debug={printFrequency:function(t,e){var n,r=e.getContext("2d");for(e.width=t.length,e.height=256,r.beginPath(),r.strokeStyle="blue",n=0;n0?t.videoWidth>10&&t.videoHeight>10?e():window.setTimeout(r,500):n("Unable to play video stream. Is webcam working?"),o--}var o=10;r()})}function o(t,e){return n.i(d.a)(e).then(function(e){return new Promise(function(n){s=e,t.setAttribute("autoplay",!0),t.setAttribute("muted",!0),t.setAttribute("playsinline",!0),t.srcObject=e,t.addEventListener("loadedmetadata",function(){t.play(),n()})})}).then(r.bind(null,t))}function i(t){var e=l()(t,["width","height","facingMode","aspectRatio","deviceId"]);return void 0!==t.minAspectRatio&&t.minAspectRatio>0&&(e.aspectRatio=t.minAspectRatio,console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead")),void 0!==t.facing&&(e.facingMode=t.facing,console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'")),e}function a(t){var e={audio:!1,video:i(t)};return e.video.deviceId&&e.video.facingMode&&delete e.video.facingMode,Promise.resolve(e)}function u(){return n.i(d.b)().then(function(t){return t.filter(function(t){return"videoinput"===t.kind})})}function c(){if(s){var t=s.getVideoTracks();if(t&&t.length)return t[0]}}var s,f=n(162),l=n.n(f),d=n(52);e.a={request:function(t,e){return a(e).then(o.bind(null,t))},release:function(){var t=s&&s.getVideoTracks();t&&t.length&&t[0].stop(),s=null},enumerateVideoDevices:u,getActiveStreamLabel:function(){var t=c();return t?t.label:""},getActiveTrack:c}},function(t,e,n){"use strict";function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:d;return/^blob\:/i.test(t)?i(t).then(o).then(function(t){return a(t,e)}):Promise.resolve(null)}function o(t){return new Promise(function(e){var n=new FileReader;n.onload=function(t){return e(t.target.result)},n.readAsArrayBuffer(t)})}function i(t){return new Promise(function(e,n){var r=new XMLHttpRequest;r.open("GET",t,!0),r.responseType="blob",r.onreadystatechange=function(){r.readyState!==XMLHttpRequest.DONE||200!==r.status&&0!==r.status||e(this.response)},r.onerror=n,r.send()})}function a(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:d,n=new DataView(t),r=t.byteLength,o=e.reduce(function(t,e){var n=Object.keys(l).filter(function(t){return l[t]===e})[0];return n&&(t[n]=e),t},{}),i=2;if(255!==n.getUint8(0)||216!==n.getUint8(1))return!1;for(;i1?i.size:Math.floor(e/o*i.size):e,r=i.size?e/o>1?Math.floor(o/e*i.size):i.size:o,s.x=n,s.y=r}var n,r,o={},i=null,a=["canrecord","ended"],u={},c={x:0,y:0},s={x:0,y:0};return o.getRealWidth=function(){return t.videoWidth},o.getRealHeight=function(){return t.videoHeight},o.getWidth=function(){return n},o.getHeight=function(){return r},o.setWidth=function(t){n=t},o.setHeight=function(t){r=t},o.setInputStream=function(e){i=e,t.src=void 0!==e.src?e.src:""},o.ended=function(){return t.ended},o.getConfig=function(){return i},o.setAttribute=function(e,n){t.setAttribute(e,n)},o.pause=function(){t.pause()},o.play=function(){t.play()},o.setCurrentTime=function(e){"LiveStream"!==i.type&&(t.currentTime=e)},o.addEventListener=function(e,n,r){a.indexOf(e)!==-1?(u[e]||(u[e]=[]),u[e].push(n)):t.addEventListener(e,n,r)},o.clearEventHandlers=function(){a.forEach(function(e){var n=u[e];n&&n.length>0&&n.forEach(function(n){t.removeEventListener(e,n)})})},o.trigger=function(t,n){var r,i=u[t];if("canrecord"===t&&e(),i&&i.length>0)for(r=0;r1?a.size:Math.floor(u/c*a.size):u,o=a.size?u/c>1?Math.floor(c/u*a.size):a.size:c,x.x=n,x.y=o,l=!0,s=0,setTimeout(function(){e("canrecord",[])},0)},p,h,a.sequence)}function e(t,e){var n,r=y[t];if(r&&r.length>0)for(n=0;nf&&(f=o.box[r][0]),o.box[r][1]l&&(l=o.box[r][1]);for(a=[[c,s],[f,s],[f,l],[c,l]],u=p.halfSample?2:1,i=M.invert(i,i),r=0;r<4;r++)I.transformMat2(a[r],a[r],i);for(r=0;r<4;r++)I.scale(a[r],a[r],u);return a}function a(){n.i(w.f)(v,E),E.zeroBorder()}function u(){var t,e,n,r,o,i,a,u=[];for(t=0;t0&&r[x.data[n]-1]++;return r=r.map(function(t,e){return{val:t,label:e+1}}),r.sort(function(t,e){return e.val-t.val}),r.filter(function(t){return t.val>=5})}function s(t,e){var n,r,o,a,u=[],c=[];for(n=0;n=2){for(o=0;ol&&c.push(t[o]);if(c.length>=2){for(a=f(c),i=0,o=0;o1&&a.length>=c.length/4*3&&a.length>t.length/4&&(i/=a.length,u={index:e[1]*z.x+e[0],pos:{x:n,y:r},box:[I.clone([n,r]),I.clone([n+g.size.x,r]),I.clone([n+g.size.x,r+g.size.y]),I.clone([n,r+g.size.y])],moments:a,rad:i,vec:I.clone([Math.cos(i),Math.sin(i)])},s.push(u))}}return s}function h(t){function e(){var t;for(t=0;ta&&n(u):x.data[u]=Number.MAX_VALUE}var r,o,i=0,a=.95,u=0;for(T.a.init(m.data,0),T.a.init(x.data,0),T.a.init(b.data,null),r=0;r0) {length=length - 1|0;images[outImagePtr+length|0]=(images[aImagePtr+length|0]|0) - (images[bImagePtr+length|0]|0)|0;}}function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) {aImagePtr=aImagePtr|0;bImagePtr=bImagePtr|0;outImagePtr=outImagePtr|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[outImagePtr+length|0]=images[aImagePtr+length|0]|0|(images[bImagePtr+length|0]|0)|0;}}function countNonZero(imagePtr) {imagePtr=imagePtr|0;var sum=0,length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;sum=(sum|0)+(images[imagePtr+length|0]|0)|0;}return sum|0;}function init(imagePtr, value) {imagePtr=imagePtr|0;value=value|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[imagePtr+length|0]=value;}}function dilate(inImagePtr, outImagePtr) {inImagePtr=inImagePtr|0;outImagePtr=outImagePtr|0;var v=0,u=0,sum=0,yStart1=0,yStart2=0,xStart1=0,xStart2=0,offset=0;for (v=1; (v|0)<(size - 1|0); v=v+1|0) {offset=offset+size|0;for (u=1; (u|0)<(size - 1|0); u=u+1|0) {yStart1=offset - size|0;yStart2=offset+size|0;xStart1=u - 1|0;xStart2=u+1|0;sum=(images[inImagePtr+yStart1+xStart1|0]|0)+(images[inImagePtr+yStart1+xStart2|0]|0)+(images[inImagePtr+offset+u|0]|0)+(images[inImagePtr+yStart2+xStart1|0]|0)+(images[inImagePtr+yStart2+xStart2|0]|0)|0;if ((sum|0)>(0|0)) {images[outImagePtr+offset+u|0]=1;} else {images[outImagePtr+offset+u|0]=0;}}}return;}function memcpy(srcImagePtr, dstImagePtr) {srcImagePtr=srcImagePtr|0;dstImagePtr=dstImagePtr|0;var length=0;length=imul(size, size)|0;while ((length|0)>0) {length=length - 1|0;images[dstImagePtr+length|0]=images[srcImagePtr+length|0]|0;}}function zeroBorder(imagePtr) {imagePtr=imagePtr|0;var x=0,y=0;for (x=0; (x|0)<(size - 1|0); x=x+1|0) {images[imagePtr+x|0]=0;images[imagePtr+y|0]=0;y=y+size - 1|0;images[imagePtr+y|0]=0;y=y+1|0;}for (x=0; (x|0)<(size|0); x=x+1|0) {images[imagePtr+y|0]=0;y=y+1|0;}}function skeletonize() {var subImagePtr=0,erodedImagePtr=0,tempImagePtr=0,skelImagePtr=0,sum=0,done=0;erodedImagePtr=imul(size, size)|0;tempImagePtr=erodedImagePtr+erodedImagePtr|0;skelImagePtr=tempImagePtr+erodedImagePtr|0;init(skelImagePtr, 0);zeroBorder(subImagePtr);do {erode(subImagePtr, erodedImagePtr);dilate(erodedImagePtr, tempImagePtr);subtract(subImagePtr, tempImagePtr, tempImagePtr);bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr);memcpy(erodedImagePtr, subImagePtr);sum=countNonZero(subImagePtr)|0;done=(sum|0) == 0|0;} while (!done);}return {skeletonize: skeletonize};} __webpack_exports__["a"]=Skeletonizer; },function(t,e,n){"use strict";function r(t){o.a.call(this,t),this.barSpaceRatio=[1,1]}var o=n(1),i=1,a=3,u={START_PATTERN:{value:[a,i,a,i,i,i]},STOP_PATTERN:{value:[a,i,i,i,a]},CODE_PATTERN:{value:[[i,i,a,a,i],[a,i,i,i,a],[i,a,i,i,a],[a,a,i,i,i],[i,i,a,i,a],[a,i,a,i,i],[i,a,a,i,i],[i,i,i,a,a],[a,i,i,a,i],[i,a,i,a,i]]},SINGLE_CODE_ERROR:{value:.78,writable:!0},AVG_CODE_ERROR:{value:.3,writable:!0},FORMAT:{value:"2of5"}},c=u.START_PATTERN.value.reduce(function(t,e){return t+e},0);r.prototype=Object.create(o.a.prototype,u),r.prototype.constructor=r,r.prototype._findPattern=function(t,e,n,r){var o,i,a,u,c=[],s=this,f=0,l={error:Number.MAX_VALUE,code:-1,start:0,end:0},d=s.AVG_CODE_ERROR;for(n=n||!1,r=r||!1,e||(e=s._nextSet(s._row)),o=0;o=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start)/2,e1&&i._isStartEnd(n))break}while(ri._counters.length?i._counters.length:r,o=t.start+i._sumCounters(t.startCounter,r-8),{code:a.join(""),start:t.start,end:o,startInfo:t,decodedCodes:a}):null},r.prototype._verifyWhitespace=function(t,e){return(t-1<=0||this._counters[t-1]>=this._calculatePatternLength(t)/2)&&(e+8>=this._counters.length||this._counters[e+7]>=this._calculatePatternLength(e)/2)},r.prototype._calculatePatternLength=function(t){var e,n=0;for(e=t;e=0;i--)n=2==(1&i)?c.bar:c.space,r=1==(1&a)?n.wide:n.narrow,r.size+=u._counters[s+i],r.counts++,a>>=1;s+=8}return["space","bar"].forEach(function(t){var e=c[t];e.wide.min=Math.floor((e.narrow.size/e.narrow.counts+e.wide.size/e.wide.counts)/2),e.narrow.max=Math.ceil(e.wide.min),e.wide.max=Math.ceil((e.wide.size*u.MAX_ACCEPTABLE+u.PADDING)/e.wide.counts)}),c},r.prototype._charToPattern=function(t){var e,n=this,r=t.charCodeAt(0);for(e=0;e=0;r--){if(o=0==(1&r)?s.bar:s.space,i=1==(1&u)?o.wide:o.narrow,(a=c._counters[f+r])i.max)return!1;u>>=1}f+=8}return!0},r.prototype._patternToChar=function(t){var e,n=this;for(e=0;ei&&(i=r),rthis._counters.length)return-1;for(e=this._computeAlternatingThreshold(t,a),n=this._computeAlternatingThreshold(t+1,a),r=0;ro&&(c|=u),u>>=1;return c},r.prototype._isStartEnd=function(t){var e;for(e=0;eu.AVG_CODE_ERROR?null:(u.CODE_PATTERN[l.code]&&(l.correction.bar=o(u.CODE_PATTERN[l.code],a,this.MODULE_INDICES.bar),l.correction.space=o(u.CODE_PATTERN[l.code],a,this.MODULE_INDICES.space)),l)}f++,a[f]=1,s=!s}return null},r.prototype._correct=function(t,e){this._correctBars(t,e.bar,this.MODULE_INDICES.bar),this._correctBars(t,e.space,this.MODULE_INDICES.space)},r.prototype._findStart=function(){var t,e,n,r,i,a=[0,0,0,0,0,0],u=this,c=u._nextSet(u._row),s=!1,f=0,l={error:Number.MAX_VALUE,code:-1,start:0,end:0,correction:{bar:1,space:1}};for(t=c;t4)return-1;if(0==(1&i))for(var u=0;u="a"&&o<="d"){if(r>e-2)return null;var i=t[++r],a=i.charCodeAt(0),u=void 0;switch(o){case"a":if(!(i>="A"&&i<="Z"))return null;u=String.fromCharCode(a-64);break;case"b":if(i>="A"&&i<="E")u=String.fromCharCode(a-38);else if(i>="F"&&i<="J")u=String.fromCharCode(a-11);else if(i>="K"&&i<="O")u=String.fromCharCode(a+16);else if(i>="P"&&i<="S")u=String.fromCharCode(a+43);else{if(!(i>="T"&&i<="Z"))return null;u=String.fromCharCode(127)}break;case"c":if(i>="A"&&i<="O")u=String.fromCharCode(a-32);else{if("Z"!==i)return null;u=":"}break;case"d":if(!(i>="A"&&i<="Z"))return null;u=String.fromCharCode(a+32)}n.push(u)}else n.push(o)}return n},r.prototype._verifyChecksums=function(t){return this._matchCheckChar(t,t.length-2,20)&&this._matchCheckChar(t,t.length-1,15)},r.prototype._matchCheckChar=function(t,e,n){var r=this,o=t.slice(0,e),i=o.length,a=o.reduce(function(t,e,o){return t+((o*-1+(i-1))%n+1)*r.ALPHABET.indexOf(e.charCodeAt(0))},0);return this.ALPHABET[a%47]===t[e].charCodeAt(0)},e.a=r},function(t,e,n){"use strict";function r(){o.a.call(this)}var o=n(4),i={FORMAT:{value:"ean_2",writeable:!1}};r.prototype=Object.create(o.a.prototype,i),r.prototype.constructor=r,r.prototype.decode=function(t,e){this._row=t;var n,r=0,o=0,i=e,a=this._row.length,u=[],c=[];for(o=0;o<2&&i=this.CODE_G_START&&(r|=1<<1-o),1!=o&&(i=this._nextSet(this._row,n.end),i=this._nextUnset(this._row,i))}return 2!=u.length||parseInt(u.join(""))%4!==r?null:{code:u.join(""),decodedCodes:c,end:n.end}},e.a=r},function(t,e,n){"use strict";function r(){a.a.call(this)}function o(t){var e;for(e=0;e<10;e++)if(t===c[e])return e;return null}function i(t){var e,n=t.length,r=0;for(e=n-2;e>=0;e-=2)r+=t[e];for(r*=3,e=n-1;e>=0;e-=2)r+=t[e];return(r*=3)%10}var a=n(4),u={FORMAT:{value:"ean_5",writeable:!1}},c=[24,20,18,17,12,6,3,10,9,5];r.prototype=Object.create(a.a.prototype,u),r.prototype.constructor=r,r.prototype.decode=function(t,e){this._row=t;var n,r=0,a=0,u=e,c=this._row.length,s=[],f=[];for(a=0;a<5&&u=this.CODE_G_START&&(r|=1<<4-a),4!=a&&(u=this._nextSet(this._row,n.end),u=this._nextUnset(this._row,u))}return 5!=s.length?null:i(s)!==o(r)?null:{code:s.join(""),decodedCodes:f,end:n.end}},e.a=r},function(t,e,n){"use strict";function r(t,e){o.a.call(this,t,e)}var o=n(4),i={FORMAT:{value:"ean_8",writeable:!1}};r.prototype=Object.create(o.a.prototype,i),r.prototype.constructor=r,r.prototype._decodePayload=function(t,e,n){var r,o=this;for(r=0;r<4;r++){if(!(t=o._decodeCode(t.end,o.CODE_G_START)))return null;e.push(t.code),n.push(t)}if(null===(t=o._findPattern(o.MIDDLE_PATTERN,t.end,!0,!1)))return null;for(n.push(t),r=0;r<4;r++){if(!(t=o._decodeCode(t.end,o.CODE_G_START)))return null;n.push(t),e.push(t.code)}return t},e.a=r},function(t,e,n){"use strict";function r(t){t=a()(o(),t),u.a.call(this,t),this.barSpaceRatio=[1,1],t.normalizeBarSpaceWidth&&(this.SINGLE_CODE_ERROR=.38,this.AVG_CODE_ERROR=.09)}function o(){var t={};return Object.keys(r.CONFIG_KEYS).forEach(function(e){t[e]=r.CONFIG_KEYS[e].default}),t}var i=n(28),a=n.n(i),u=n(1),c=1,s=3,f={START_PATTERN:{value:[c,c,c,c]},STOP_PATTERN:{value:[c,c,s]},CODE_PATTERN:{value:[[c,c,s,s,c],[s,c,c,c,s],[c,s,c,c,s],[s,s,c,c,c],[c,c,s,c,s],[s,c,s,c,c],[c,s,s,c,c],[c,c,c,s,s],[s,c,c,s,c],[c,s,c,s,c]]},SINGLE_CODE_ERROR:{value:.78,writable:!0},AVG_CODE_ERROR:{value:.38,writable:!0},MAX_CORRECTION_FACTOR:{value:5},FORMAT:{value:"i2of5"}};r.prototype=Object.create(u.a.prototype,f),r.prototype.constructor=r,r.prototype._matchPattern=function(t,e){if(this.config.normalizeBarSpaceWidth){var n,r=[0,0],o=[0,0],i=[0,0],a=this.MAX_CORRECTION_FACTOR,c=1/a;for(n=0;n=0&&n._matchRange(t,e.start,0))return e;r=e.end,e=null}},r.prototype._verifyTrailingWhitespace=function(t){var e,n=this;return e=t.end+(t.end-t.start)/2,e=o.CODE_G_START&&(t.code=t.code-o.CODE_G_START,i|=1<<5-r),e.push(t.code),n.push(t)}return o._determineParity(i,e)?t:null},r.prototype._determineParity=function(t,e){var n,r;for(r=0;r0&&n(f)?e>1?r(f,e-1,n,a,u):o(u,f):a||(u[u.length]=f)}return u}var o=n(90),i=n(128);t.exports=r},function(t,e,n){var r=n(117),o=r();t.exports=o},function(t,e,n){function r(t,e){e=o(e,t);for(var n=0,r=e.length;null!=t&&n1?n[o-1]:void 0,u=o>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(o--,a):void 0,u&&i(n[0],n[1],u)&&(a=o<3?void 0:a,o=1),e=Object(e);++r-1}var o=n(12);t.exports=r},function(t,e,n){function r(t,e){var n=this.__data__,r=o(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}var o=n(12);t.exports=r},function(t,e,n){function r(){this.size=0,this.__data__={hash:new o,map:new(a||i),string:new o}}var o=n(84),i=n(10),a=n(33);t.exports=r},function(t,e,n){function r(t){var e=o(this,t).delete(t);return this.size-=e?1:0,e}var o=n(14);t.exports=r},function(t,e,n){function r(t){return o(this,t).get(t)}var o=n(14);t.exports=r},function(t,e,n){function r(t){return o(this,t).has(t)}var o=n(14);t.exports=r},function(t,e,n){function r(t,e){var n=o(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this}var o=n(14);t.exports=r},function(t,e,n){function r(t){var e=o(t,function(t){return n.size===i&&n.clear(),t}),n=e.cache;return e}var o=n(161),i=500;t.exports=r},function(t,e){function n(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=n},function(t,e,n){(function(t){var r=n(38),o="object"==typeof e&&e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o,u=a&&r.process,c=function(){try{return u&&u.binding&&u.binding("util")}catch(t){}}();t.exports=c}).call(e,n(29)(t))},function(t,e){function n(t){return o.call(t)}var r=Object.prototype,o=r.toString;t.exports=n},function(t,e){function n(t,e){return function(n){return t(e(n))}}t.exports=n},function(t,e){function n(t){var e=0,n=0;return function(){var a=i(),u=o-(a-n);if(n=a,u>0){if(++e>=r)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var r=800,o=16,i=Date.now;t.exports=n},function(t,e,n){function r(){this.__data__=new o,this.size=0}var o=n(10);t.exports=r},function(t,e){function n(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}t.exports=n},function(t,e){function n(t){return this.__data__.get(t)}t.exports=n},function(t,e){function n(t){return this.__data__.has(t)}t.exports=n},function(t,e,n){function r(t,e){var n=this.__data__;if(n instanceof o){var r=n.__data__;if(!i||r.length=e&&t.y>=e&&t.x0){var h=n[c-1];h.m00+=1,h.m01+=o,h.m10+=u,h.m11+=u*o,h.m02+=s,h.m20+=u*u}}for(var l=Math.PI,f=l/4,d=0;d=0?f:-f)+l;v.theta=(180*b/l+90)%180-90,v.theta<0&&(v.theta+=180),v.rad=b>l?b-l:b,v.x=Math.cos(b),v.y=Math.sin(b),i.push(v)}}return i}},{key:"show",value:function(t,e){var r=this.size.y,n=this.size.x,i=t.getImageData(0,0,n,r),a=i.data,o=0;e||(e=1);for(var s=0;s360)&&(e=360);for(var h=this.data.length;h--;){i[0]=this.data[h]*e;var l=i[0]<=0?a:i[0]>=360?o:Object(c.a)(i);u[4*h+0]=l[0],u[4*h+1]=l[1],u[4*h+2]=l[2],u[4*h+3]=255}t.putImageData(s,r,n)}}]),t}()},function(t,e){function r(t,e,r,n,i,a,o){try{var s=t[a](o),u=s.value}catch(t){return void r(t)}s.done?e(u):Promise.resolve(u).then(n,i)}t.exports=function(t){return function(){var e=this,n=arguments;return new Promise(function(i,a){var o=t.apply(e,n);function s(t){r(o,i,a,s,u,"next",t)}function u(t){r(o,i,a,s,u,"throw",t)}s(void 0)})}}},function(t,e,r){"use strict";r.d(e,"a",function(){return n});var n={drawPath:function(t,e,r,n){t&&t.length>1&&(e.strokeStyle=r,e.fillStyle=r,e.lineWidth=n,e.beginPath(),e.moveTo(t[0].x,t[0].y),t.slice(1).forEach(function(t){var r=t.x,n=t.y;return e.lineTo(r,n)}),e.closePath(),e.stroke())},drawImage:function(t,e,r,n){var i=n.getImageData(0,0,e,r),a=i.data,o=0|t.length,s=0|a.length;if(s/o!=4)return!1;for(;o--;){var u=t[o];a[--s]=255,a[--s]=u,a[--s]=u,a[--s]=u}return n.putImageData(i,0,0),!0}}},function(t,e){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function n(e){return"function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?t.exports=n=function(t){return r(t)}:t.exports=n=function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":r(t)},n(e)}t.exports=n},function(t,e,r){var n=r(22),i=r(23),a=r(24);t.exports=function(t){return n(t)||i(t)||a()}},function(t,e,r){"use strict";function n(t){var e=t[0],r=t[1],n=t[2],i=t[3],a=e*i-n*r;return a?new Float32Array([i/a,-r/a,-n/a,e/a]):null}function i(t,e){var r=t.x,n=t.y;return{x:e[0]*r+e[2]*n,y:e[1]*r+e[3]*n}}function a(t,e){e||(e=8);var r=8-e,n=function(t,e){e||(e=8);for(var r=t.data,n=8-e,i=new Int32Array(1<>n]++;return i}(t,e),i=[0],a=(1<n[t]?r:t},0)<>1,s=0,u=n,c=0;u>2,c++,s+=2,u+=2;s+=n,u+=n}}r.d(e,"b",function(){return n}),r.d(e,"d",function(){return i}),r.d(e,"c",function(){return o}),r.d(e,"a",function(){return s})},function(t,e,r){"use strict";function n(t,e){var r=t[0],n=t[1],i=t[2],a=i*n,o=a*(1-Math.abs(r/60%2-1)),s=i-a,u=0,c=0,h=0;return r<60?(u=a,c=o):r<120?(u=o,c=a):r<180?(c=a,h=o):r<240?(c=o,h=a):r<300?(u=o,h=a):r<360&&(u=a,h=o),(e=e||[0,0,0])[0]=255*(u+s)|0,e[1]=255*(c+s)|0,e[2]=255*(h+s)|0,e}r.d(e,"a",function(){return n})},function(t,e,r){"use strict";function n(t){for(var e=new Array,r=new Array,n=1;n*n<=t;n++)t%n==0&&(e.push(n),n*n!==t&&r.unshift(t/n|0));return e.concat(r)}function i(t,e){var r=e.x,i=e.y,a=0|Math.max(0|r,0|i),o=[8,10,15,20,32,60,80],s={"x-small":5,small:4,medium:3,large:2,"x-large":1},u=s[t]||0|s.medium,c=0|o[u],h=a/c|0;function l(t){for(var e=0,r=0|t[t.length>>1];e0&&(r=Math.abs(t[e]-h)>Math.abs(t[e-1]-h)?0|t[e-1]:0|t[e]),h/ro[u-1]/o[u]?{x:r,y:r}:null}return l(function(t,e){if(t===e)return n(t);for(var r=t>e?t:e,i=t>e?e:t,a=new Array,o=new Array,s=1;s*s<=i;s++)if(r%s==0&&i%s==0){a.push(s);var u=i/s|0;s!==u&&r%u==0&&o.unshift()}return a.concat(o)}(r,i))||l(n(a))||l(n(h*c))}function a(t,e){var r=t.width,n=t.height,a=e.halfSample?1:0,s=t.config;if(s&&s.area){var u=function(t,e,r){var n={width:t,height:e},i=Object.keys(r).reduce(function(t,e){var i=r[e],a=function(t){return{value:parseFloat(t),unit:t.indexOf("%")===t.length-1?"%":t.indexOf("px")===t.length-2?"px":"%"}}(i),s=o[e](a,n);return t[e]=s,t},{});return{topLeft:{x:i.left,y:i.top},width:i.right-i.left,height:i.bottom-i.top}}(r,n,s.area);t.topLeft=u.topLeft,t.setCanvasSize(r,n),r=u.width,n=u.height}var c={x:r>>a,y:n>>a},h=i(e.patchSize,c);if(t.width=(c.x/h.x<u&&(u=e),rc&&(c=r)})});var h=[{x:o,y:s},{x:u,y:s},{x:u,y:c},{x:o,y:c}];return h=h.map(function(t){return Object(d.d)(t,a)}),this._config.halfSample&&(h=h.map(function(t){var e=t.x,r=t.y;return{x:2*e,y:r*=2}})),h}},{key:"_binarizeImage",value:function(){Object(d.c)(this._currentImageWrapper,this._binaryImageWrapper),this._binaryImageWrapper.zeroBorder()}},{key:"_findPatches",value:function(){for(var t=new Array,e=0;e0&&e[t-1]++}),e.map(function(t,e){return{value:t,index:e}}).filter(function(t){return t.value>=5}).sort(function(t,e){return e.value-t.value}).map(function(t){return t.index+1})}},{key:"_findBoxes",value:function(t,e){var r=this,n=new Array;return t.forEach(function(t){var e=new Array;r._patchLabelGrid.data.forEach(function(n,i){n===t&&e.push(r._imageToPatchGrid[i])});var i=r._boxFromPatches(e);i&&n.push(i)}),n}},{key:"_similarMoments",value:function(t){return c.a.clusterize(t,.9).reduce(function(t,e){var r=e.moments.length;return r>t.count?{item:e,count:r}:t},{item:{moments:[]},count:0}).item.moments}},{key:"_skeletonize",value:function(t,e){this._binaryImageWrapper.subImageAsCopy(this._subImageWrapper,t,e),this._skeletonizer.skeletonize()}},{key:"_describePatch",value:function(t,e,r,n){if(t.length>1){var i=Math.ceil(this._patchSize.x/3),a=t.filter(function(t){return t.m00>i});if(a.length>1){var o=this._similarMoments(a),s=0|o.length;if(s>1&&s<<2>=3*a.length&&s<<2>t.length){var u=o.reduce(function(t,e){return t+e.rad},0)/s;return{index:e,pos:{x:r,y:n},box:[{x:r,y:n},{x:r+this._subImageWrapper.size.x,y:n},{x:r+this._subImageWrapper.size.x,y:n+this._subImageWrapper.size.y},{x:r,y:n+this._subImageWrapper.size.y}],moments:o,rad:u,x:Math.cos(u),y:Math.sin(u)}}}}return null}},{key:"_notYetProcessed",value:function(){for(var t=0;t.95&&r._trace(u,e)}})}}},{key:"_rasterizeAngularSimilarity",value:function(t){var e=this,r=0;this._patchGrid.data.fill(0),this._patchLabelGrid.data.fill(0),this._imageToPatchGrid.fill(null),t.forEach(function(t){e._imageToPatchGrid[t.index]=t,e._patchGrid.data[t.index]=1}),this._patchGrid.zeroBorder();for(var n=0;(n=this._notYetProcessed())this._threshold}},{key:"moments",get:function(){return this._moments}}]),t}()},function(t,e,r){"use strict";r.d(e,"a",function(){return f});var n,i,a=r(2),o=r.n(a),s=r(1),u=r.n(s),c=r(0),h=r.n(c),l=r(17);!function(t){t[t.Outside=-32767]="Outside",t[t.Inside=-32766]="Inside"}(n||(n={})),function(t){t[t.CW=0]="CW",t[t.CCW=1]="CCW",t[t.Unknown=2]="Unknown"}(i||(i={}));var f=function(){function t(e,r){o()(this,t),h()(this,"_width",void 0),h()(this,"_height",void 0),h()(this,"_tracer",void 0),h()(this,"_imageData",void 0),h()(this,"_labelData",void 0),this._imageData=e.data,this._labelData=r.data,this._width=e.size.x,this._height=e.size.y,this._tracer=new l.b(e,r)}return u()(t,[{key:"rasterize",value:function(t){for(var e=new Array,r=0;r<400;r++)e[r]=0;e[0]=this._imageData[0];for(var a,o=null,s=0,u=1;u0){o=o-1|0;n[r+o|0]=(n[t+o|0]|0)-(n[e+o|0]|0)|0}}function u(t,e,r){t=t|0;e=e|0;r=r|0;var o=0;o=a(i,i)|0;while((o|0)>0){o=o-1|0;n[r+o|0]=n[t+o|0]|0|(n[e+o|0]|0)|0}}function c(t){t=t|0;var e=0,r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;e=(e|0)+(n[t+r|0]|0)|0}return e|0}function h(t,e){t=t|0;e=e|0;var r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;n[t+r|0]=e}}function l(t,e){t=t|0;e=e|0;var r=0,a=0,o=0,s=0,u=0,c=0,h=0,l=0;for(r=1;(r|0)<(i-1|0);r=r+1|0){l=l+i|0;for(a=1;(a|0)<(i-1|0);a=a+1|0){s=l-i|0;u=l+i|0;c=a-1|0;h=a+1|0;o=(n[t+s+c|0]|0)+(n[t+s+h|0]|0)+(n[t+l+a|0]|0)+(n[t+u+c|0]|0)+(n[t+u+h|0]|0)|0;if((o|0)>(0|0)){n[e+l+a|0]=1}else{n[e+l+a|0]=0}}}return}function f(t,e){t=t|0;e=e|0;var r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;n[e+r|0]=n[t+r|0]|0}}function d(t){t=t|0;var e=0,r=0;for(e=0;(e|0)<(i-1|0);e=e+1|0){n[t+e|0]=0;n[t+r|0]=0;r=r+i-1|0;n[t+r|0]=0;r=r+1|0}for(e=0;(e|0)<(i|0);e=e+1|0){n[t+r|0]=0;r=r+1|0}}function v(){var t=0,e=0,r=0,n=0,v=0,_=0;e=a(i,i)|0;r=e+e|0;n=r+e|0;h(n,0);d(t);do{o(t,e);l(e,r);s(t,r,r);u(n,r,n);f(e,t);v=c(t)|0;_=(v|0)==0|0}while(!_)}return{skeletonize:v}}},function(t,e){t.exports=function(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e=0,a=i&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,t.exports=r(28),i)n.regeneratorRuntime=a;else try{delete n.regeneratorRuntime}catch(t){n.regeneratorRuntime=void 0}},function(t,e){!function(e){"use strict";var r,n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag",c="object"==typeof t,h=e.regeneratorRuntime;if(h)c&&(t.exports=h);else{(h=e.regeneratorRuntime=c?t.exports:{}).wrap=b;var l="suspendedStart",f="suspendedYield",d="executing",v="completed",_={},p={};p[o]=function(){return this};var g=Object.getPrototypeOf,y=g&&g(g(I([])));y&&y!==n&&i.call(y,o)&&(p=y);var m=C.prototype=x.prototype=Object.create(p);k.prototype=m.constructor=C,C.constructor=k,C[u]=k.displayName="GeneratorFunction",h.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===k||"GeneratorFunction"===(e.displayName||e.name))},h.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,C):(t.__proto__=C,u in t||(t[u]="GeneratorFunction")),t.prototype=Object.create(m),t},h.awrap=function(t){return{__await:t}},E(S.prototype),S.prototype[s]=function(){return this},h.AsyncIterator=S,h.async=function(t,e,r,n){var i=new S(b(t,e,r,n));return h.isGeneratorFunction(e)?i:i.next().then(function(t){return t.done?t.value:i.next()})},E(m),m[u]="Generator",m[o]=function(){return this},m.toString=function(){return"[object Generator]"},h.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},h.values=I,R.prototype={constructor:R,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=r,this.done=!1,this.delegate=null,this.method="next",this.arg=r,this.tryEntries.forEach(P),!t)for(var e in this)"t"===e.charAt(0)&&i.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=r)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(n,i){return s.type="throw",s.arg=t,e.next=n,i&&(e.method="next",e.arg=r),!!i}for(var a=this.tryEntries.length-1;a>=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=i.call(o,"catchLoc"),c=i.call(o,"finallyLoc");if(u&&c){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&i.call(n,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),P(r),_}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;P(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:I(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),_}}}function b(t,e,r,n){var i=e&&e.prototype instanceof x?e:x,a=Object.create(i.prototype),o=new R(n||[]);return a._invoke=function(t,e,r){var n=l;return function(i,a){if(n===d)throw new Error("Generator is already running");if(n===v){if("throw"===i)throw a;return z()}for(r.method=i,r.arg=a;;){var o=r.delegate;if(o){var s=A(o,r);if(s){if(s===_)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===l)throw n=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=d;var u=w(t,e,r);if("normal"===u.type){if(n=r.done?v:f,u.arg===_)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n=v,r.method="throw",r.arg=u.arg)}}}(t,r,o),a}function w(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}function x(){}function k(){}function C(){}function E(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function S(t){var e;this._invoke=function(r,n){function a(){return new Promise(function(e,a){!function e(r,n,a,o){var s=w(t[r],t,n);if("throw"!==s.type){var u=s.arg,c=u.value;return c&&"object"==typeof c&&i.call(c,"__await")?Promise.resolve(c.__await).then(function(t){e("next",t,a,o)},function(t){e("throw",t,a,o)}):Promise.resolve(c).then(function(t){u.value=t,a(u)},function(t){return e("throw",t,a,o)})}o(s.arg)}(r,n,e,a)})}return e=e?e.then(a,a):a()}}function A(t,e){var n=t.iterator[e.method];if(n===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=r,A(t,e),"throw"===e.method))return _;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return _}var i=w(n,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,_;var a=i.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,_):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,_)}function O(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function P(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function R(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function I(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function e(){for(;++nr)return Number.MAX_VALUE;n+=l}return n/a}},{key:"_correctBars",value:function(t,e,r){for(var n=r.length,i=0;n--;)(i=t[r[n]]*(1-(1-e)/2))>1&&(t[r[n]]=i)}},{key:"decodePattern",value:function(t){this._row=t;var e=this.decode();return null===e?(this._row.reverse(),(e=this.decode())&&(e.direction=b.Reverse,e.start=this._row.length-e.start,e.end=this._row.length-e.end)):e.direction=b.Forward,e&&(e.format=this.FORMAT),e}},{key:"_fillCounters",value:function(t,e,r){var n=new Array,i=0;n[i]=0;for(var a=t;aa)return null;var l=I[i.code];return l&&(i.correction.bar=this._calculateCorrection(l,r,z),i.correction.space=this._calculateCorrection(l,r,D)),i}r[++s]=1,o=o?0:1}return null}},{key:"_correct",value:function(t,e){this._correctBars(t,e.bar,z),this._correctBars(t,e.space,D)}},{key:"_findStart",value:function(){for(var t,e=[0,0,0,0,0,0],r=this._nextSet(this._row),n={error:Number.MAX_VALUE,code:-1,start:0,end:0,correction:{bar:1,space:1}},i=this.AVERAGE_CODE_ERROR,a=0,o=0,s=r;s=n}},{key:"_findNextWidth",value:function(t,e){for(var r=Number.MAX_VALUE,n=0;ne&&(r=t[n]);return r}},{key:"_toPattern",value:function(t){for(var e,r=t.length,n=0,i=r,a=0;i>3;){n=this._findNextWidth(t,n),i=0,e=0;for(var o=0;on&&(e|=1<0;s++)if(t[s]>n&&(i--,2*t[s]>=a))return-1;return e}}return-1}},{key:"_findStart",value:function(){for(var t,e=this._nextSet(this._row),r=e,n=new Uint16Array(9),i=0,a=0,o=e;o1&&V.some(function(t){return t===e}))break}while(nthis._counters.length?this._counters.length:n;var a=t.start+this._sumCounters(t.startCounter,n-8);return{code:r.join(""),start:t.start,end:a,startInfo:t,decodedCodes:r}}},{key:"_verifyWhitespace",value:function(t,e){return(t-1<=0||this._counters[t-1]>=this._calculatePatternLength(t)/2)&&(e+8>=this._counters.length||this._counters[e+7]>=this._calculatePatternLength(e)/2)}},{key:"_calculatePatternLength",value:function(t){for(var e=0,r=t;r=0;o--){var s=2==(1&o)?r.bar:r.space,u=1==(1&a)?s.wide:s.narrow;u.size+=this._counters[n+o],u.counts++,a>>=1}n+=8}return["space","bar"].forEach(function(t){var e=r[t];e.wide.min=Math.floor((e.narrow.size/e.narrow.counts+e.wide.size/e.wide.counts)/2),e.narrow.max=Math.ceil(e.wide.min),e.wide.max=Math.ceil((2*e.wide.size+1.5)/e.wide.counts)}),r}},{key:"_charToPattern",value:function(t){for(var e=t.charCodeAt(0),r=0;r=0;o--){var s=0==(1&o)?r.bar:r.space,u=1==(1&a)?s.wide:s.narrow,c=this._counters[n+o];if(cu.max)return!1;a>>=1}n+=8}return!0}},{key:"_patternToChar",value:function(t){for(var e=0;en&&(n=a),athis._counters.length)return-1;for(var r=this._computeAlternatingThreshold(t,e),n=this._computeAlternatingThreshold(t+1,e),i=64,a=0,o=0;o<7;o++){var s=0==(1&o)?r:n;this._counters[t+o]>s&&(a|=i),i>>=1}return a}},{key:"_sumCounters",value:function(t,e){for(var r=0,n=t;na?null:i}r[++s]=1,o=o?0:1}return null}},{key:"_findStart",value:function(){for(var t,e=this._nextSet(this._row);!t;){if(!(t=this._findPattern(this.START_PATTERN,e,0,!0)))return null;var r=t.start-(t.end-t.start);if(r>=0&&this._matchRange(r,t.start,0))return t;e=t.end,t=null}return null}},{key:"_verifyTrailingWhitespace",value:function(t){var e=t.end+(t.end-t.start);return e=this.CODE_G_START?(t.code-=this.CODE_G_START,n|=1<<5-i):n|=0<<5-i,e.push(t.code),r.push(t)}var a=this._calculateFirstDigit(n);if(null===a)return null;if(e.unshift(a),null===(t=this._findPattern(this.MIDDLE_PATTERN,t.end,1,!1)))return null;r.push(t);for(var o=0;o<6;o++){if(!(t=this._decodeCode(t.end,this.CODE_G_START)))return null;r.push(t),e.push(t.code)}return t}},{key:"decode",value:function(){var t=new Array,e=new Array,r={},n=this._findStart();if(!n)return null;var i={code:n.code,start:n.start,end:n.end};if(e.push(i),!(i=this._decodePayload(i,t,e)))return null;if(!(i=this._findEnd(i.end,0)))return null;if(e.push(i),!this._checksum(t))return null;if(this.supplements.length>0){var a=this._decodeExtensions(i.end);if(!a)return null;var o=a.decodedCodes[a.decodedCodes.length-1],s={start:o.start+((o.end-o.start)/2|0),end:o.end};if(!this._verifyTrailingWhitespace(s))return null;r={supplement:a,code:t.join("")+a.code}}return function(t){for(var e=1;e=0;r-=2)e+=t[r];e*=3;for(var n=t.length-1;n>=0;n-=2)e+=t[n];return e%10==0}}]),e}(R),$=function(t){function e(t,r){var n;return a()(this,e),(n=E()(this,A()(e).call(this,t,r)))._format="ean_8",n}return P()(e,t),s()(e,[{key:"_decodePayload",value:function(t,e,r){for(var n=0;n<4;n++){if(!(t=this._decodeCode(t.end,this.CODE_G_START)))return null;e.push(t.code),r.push(t)}if(null===(t=this._findPattern(this.MIDDLE_PATTERN,t.end,1,!1)))return null;r.push(t);for(var i=0;i<4;i++){if(!(t=this._decodeCode(t.end,this.CODE_G_START)))return null;r.push(t),e.push(t.code)}return t}}]),e}(J),tt=function(t){function e(t,r){var n;return a()(this,e),(n=E()(this,A()(e).call(this,t,r)))._format="ean_2",n}return P()(e,t),s()(e,[{key:"decode",value:function(t,e){var r,n=t.length,i=new Array,a=new Array,o=e,s=0;this._row=t;for(var u=0;u<2&&o=this.CODE_G_START&&(s|=1<<1-u),1!==u&&(o=this._nextSet(this._row,r.end),o=this._nextUnset(this._row,o))}return 2!==i.length||parseInt(i.join(""))%4!==s?null:{code:i.join(""),decodedCodes:a,end:r.end}}}]),e}(J),et=function(t){function e(t,r){var n;return a()(this,e),(n=E()(this,A()(e).call(this,t,r)))._format="ean_5",n}return P()(e,t),s()(e,[{key:"CHECK_DIGIT_ENCODINGS",get:function(){return[24,20,18,17,12,6,3,10,9,5]}}]),s()(e,[{key:"decode",value:function(t,e){var r,n=t.length,i=new Array,a=new Array,o=0,s=e;this._row=t;for(var u=0;u<5&&s=this.CODE_G_START&&(o|=1<<4-u),4!==u&&(s=this._nextSet(this._row,r.end),s=this._nextUnset(this._row,s))}return 5!==i.length?null:this._extensionChecksum(i)!==this._determineCheckDigit(o)?null:{code:i.join(""),decodedCodes:a,end:r.end}}},{key:"_determineCheckDigit",value:function(t){for(var e=0;e<10;e++)if(t===this.CHECK_DIGIT_ENCODINGS[e])return e;return null}},{key:"_extensionChecksum",value:function(t){for(var e=t.length,r=0,n=e-2;n>=0;n-=2)r+=t[n];r*=3;for(var i=e-1;i>=0;i-=2)r+=t[i];return(r*=3)%10}}]),e}(J),rt=function(t){function e(t,r){var n;return a()(this,e),(n=E()(this,A()(e).call(this,t,r)))._format="upc_a",n}return P()(e,t),s()(e,[{key:"decode",value:function(){var t=U()(A()(e.prototype),"decode",this).call(this);return t&&t.code&&13===t.code.length&&"0"===t.code.charAt(0)?(t.code=t.code.substring(1),t):null}}]),e}(J),nt=[[56,52,50,49,44,38,35,42,41,37],[7,11,13,14,19,25,28,21,22,26]],it=function(t){function e(t,r){var n;return a()(this,e),(n=E()(this,A()(e).call(this,t,r)))._format="upc_e",n}return P()(e,t),s()(e,[{key:"STOP_PATTERN",get:function(){return[1/6*7,1/6*7,1/6*7,1/6*7,1/6*7,1/6*7]}}]),s()(e,[{key:"_decodePayload",value:function(t,e,r){for(var n=0,i=0;i<6;i++){if(!(t=this._decodeCode(t.end)))return null;t.code>=this.CODE_G_START&&(t.code=t.code-this.CODE_G_START,n|=1<<5-i),e.push(t.code),r.push(t)}return this._determineParity(n,e)?t:null}},{key:"_determineParity",value:function(t,e){for(var r=0;r>2,n=t.start-10*r;if(n>=0&&this._matchRange(n,t.start,0))return t;e=t.end,t=null}return null}},{key:"_verifyTrailingWhitespace",value:function(t){var e=t.end+(t.end-t.start)/2;return e=0&&this._matchRange(n,t.start,0))return t;e=t.end,t=null}return null}},{key:"_verifyTrailingWhitespace",value:function(t){var e=t.end+(t.end-t.start)/2;return e4)return-1;if(0==(1&a))for(var s=0;s="a"&&i<="d"){if(n>e-2)return null;var a=t[++n],o=a.charCodeAt(0),s=void 0;switch(i){case"a":if(!(a>="A"&&a<="Z"))return null;s=String.fromCharCode(o-64);break;case"b":if(a>="A"&&a<="E")s=String.fromCharCode(o-38);else if(a>="F"&&a<="J")s=String.fromCharCode(o-11);else if(a>="K"&&a<="O")s=String.fromCharCode(o+16);else if(a>="P"&&a<="S")s=String.fromCharCode(o+43);else{if(!(a>="T"&&a<="Z"))return null;s=String.fromCharCode(127)}break;case"c":if(a>="A"&&a<="O")s=String.fromCharCode(o-32);else{if("Z"!==a)return null;s=":"}break;case"d":if(!(a>="A"&&a<="Z"))return null;s=String.fromCharCode(o+32)}r.push(s)}else r.push(i)}return r}},{key:"_verifyChecksums",value:function(t){return this._matchCheckChar(t,t.length-2,20)&&this._matchCheckChar(t,t.length-1,15)}},{key:"_matchCheckChar",value:function(t,e,r){var n=t.slice(0,e),i=n.length,a=n.reduce(function(t,e,n){return t+((-1*n+(i-1))%r+1)*vt.indexOf(e.charCodeAt(0))},0);return vt[a%47]===t[e].charCodeAt(0)}}]),e}(R)};function gt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}!function(t){t[t.Up=1]="Up",t[t.Down=-1]="Down"}(Q||(Q={}));var yt,mt=function(t,e,r){var n,i,a=0|e.x,o=0|e.y,s=0|r.x,u=0|r.y,c=Math.abs(u-o)>Math.abs(s-a),h=[],l=t.data,f=t.size.x,d=255,v=0;function _(t,e){i=l[e*f+t],d=iv?i:v,h.push(i)}c&&(n=a,a=o,o=n,n=s,s=u,u=n),a>s&&(n=a,a=s,s=n,n=o,o=u,u=n);for(var p=s-a,g=Math.abs(u-o),y=p/2|0,m=o,b=oi?Q.Up:Q.Down;a.push({pos:0,val:n[0]});for(var h=0;ho&&n[h+1]>.5*i?Q.Up:u)&&(a.push({pos:h,val:n[h]}),u=d)}a.push({pos:n.length,val:n[n.length-1]});for(var v=a[0].pos;vi?0:1;for(var _=1;_a[_].val?a[_].val+(a[_+1].val-a[_].val)/3*2|0:a[_+1].val+(a[_].val-a[_+1].val)/3|0;for(var p=a[_].pos;po?0:1}return function(t){for(var e=1;e1&&(!this._inputImageWrapper.inImageWithBorder(t[0],0)||!this._inputImageWrapper.inImageWithBorder(t[1],0));)r(-(n>>=1));return t}},{key:"_getLine",value:function(t){return[{x:(t[1].x+t[0].x)/2,y:(t[1].y+t[0].y)/2},{x:(t[3].x+t[2].x)/2,y:(t[3].y+t[2].y)/2}]}},{key:"_tryDecode",value:function(t){var e=mt(this._inputImageWrapper,t[0],t[1]);e=bt(e);var r=null;return this._barcodeReaders.some(function(t){return!!(r=t.decodePattern(e.line))}),r?{codeResult:r,barcodeLine:e}:null}},{key:"_tryDecodeBruteForce",value:function(t,e,r){for(var n=Math.sqrt(Math.pow(t[1].x-t[0].x,2)+Math.pow(t[1].y-t[0].y,2)),i=Math.sin(r),a=Math.cos(r),o=1;o<16;o++){var s=n/16*o*(o%2==0?-1:1);e[0].y+=s*i,e[0].x-=s*a,e[1].y+=s*i,e[1].x-=s*a;var u=this._tryDecode(e);if(u)return u}return null}},{key:"_printFrequency",value:function(t){var e=this._frequencyCanvas.getContext("2d");this._frequencyCanvas.width=t.length,this._frequencyCanvas.height=256,e.beginPath(),e.strokeStyle="blue";for(var r=0;r0&&(i=s,console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead")),void 0!==u&&(n=u,console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'")),{audio:!1,video:a&&n?{width:e,height:r,aspectRatio:i,deviceId:a}:{width:e,height:r,facingMode:n,aspectRatio:i,deviceId:a}}}};function Pt(t){var e=t.videoWidth,r=t.videoHeight;return new Promise(function(t,n){var i=10;!function a(){i>0?e>10&&r>10?t():window.setTimeout(a,500):n("Unable to play video stream. Is webcam working?"),i--}()})}var Rt=Math.PI/2,It=function(){function t(e,r){a()(this,t),c()(this,"_inputStream",void 0),c()(this,"_streamConfig",void 0),c()(this,"_canvas",void 0),c()(this,"_context",void 0),c()(this,"_data",void 0),c()(this,"_canvasHeight",void 0),c()(this,"_canvasWidth",void 0),c()(this,"_height",void 0),c()(this,"_width",void 0),c()(this,"_topLeft",void 0),this._inputStream=e,this._streamConfig=e.config,this._canvasWidth=e.canvasWidth,this._canvasHeight=e.canvasHeight,this._width=e.width,this._height=e.height,this._topLeft=e.topLeft,this._canvas=r||document.createElement("canvas"),this._canvas.width=this._canvasWidth,this._canvas.height=this._canvasHeight,this._context=this._canvas.getContext("2d"),this._data=new Uint8Array(this._width*this._height)}return s()(t,[{key:"grab",value:function(t){this._data=t;var e=this._inputStream.getFrame();if(e){var r;this._adjustCanvasSize();var n=0;if(e instanceof HTMLVideoElement)r=e;else if(r=e.image,e.tags)switch(e.tags.orientation){case 6:n=Rt;break;case 8:n=-Rt}if(0!==n){var i=this._canvasWidth>>1,a=this._canvasHeight>>1;this._context.translate(i,a),this._context.rotate(n),this._context.drawImage(r,-a,-i,this._canvasHeight,this._canvasWidth),this._context.rotate(-n),this._context.translate(-i,-a)}else this._context.drawImage(r,0,0,this._canvasWidth,this._canvasHeight);var o=this._context.getImageData(this._topLeft.x,this._topLeft.y,this._width,this._height).data;return this._streamConfig.halfSample?this._grayAndHalfSampleFromCanvasData(o):this._computeGray(o),!0}return!1}},{key:"_adjustCanvasSize",value:function(){this._canvas.height===this._canvasHeight&&this._canvas.width===this._canvasWidth||(this._canvas.height=this._canvasHeight,this._canvas.width=this._canvasWidth)}},{key:"_grayAndHalfSampleFromCanvasData",value:function(t){for(var e=t.length>>2,r=this._width>>1,n=0,i=this._width,a=0;i1&&void 0!==i[1]?i[1]:Dt,!/^blob:/i.test(e)){t.next=6;break}return t.next=4,Lt(e);case 4:return n=t.sent,t.abrupt("return",Tt(n,r));case 6:return t.abrupt("return",Promise.resolve(null));case 7:case"end":return t.stop()}},t)}))).apply(this,arguments)}function Tt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Dt,r=new DataView(t),n=t.byteLength,i=e.reduce(function(t,e){var r=Object.keys(zt).find(function(t){return zt[t]===e});return r&&(t[r]=e),t},{}),a=2;if(255!==r.getUint8(0)||216!==r.getUint8(1))return null;for(;at._height?t._config.size:t._width*t._config.size/t._height|0:t._width,t._canvasHeight=t._calculatedHeight=t._config.size?t._width>t._height?t._height*t._config.size/t._width|0:t._config.size:t._height,t._loaded=!0,t._frameIndex=0,setTimeout(function(){return t.trigger("canrecord",[])},0)},this._offset,this._size,this._config.sequence)}},{key:"realHeight",get:function(){return this._height}},{key:"realWidth",get:function(){return this._width}},{key:"config",get:function(){return this._config},set:function(t){this._config=function(t){for(var e=1;ee?this._config.size:t*this._config.size/e|0:t,this._canvasHeight=this._calculatedHeight=this._config.size?t>e?e*this._config.size/t|0:this._config.size:e}},{key:"realHeight",get:function(){return this._video.videoHeight}},{key:"realWidth",get:function(){return this._video.videoWidth}},{key:"config",get:function(){return this._config},set:function(t){this._config=function(t){for(var e=1;e=e&&(e+=t,ve()),window.requestAnimationFrame(r))}(performance.now())):ve()},stop:function(){Zt=!0,ge(0),"LiveStream"===re.inputStream.type&&(Ot.release(),Xt.clearEventHandlers())},decodeSingle:function(t,e){var r=this;t=m({inputStream:{type:"ImageStream",sequence:!1,size:800,src:t.src},numOfWorkers:1,locator:{halfSample:!1}},t),this.init(t,function(){d.once("processed",function(t){r.stop(),e.call(null,t)},!0),r.start()})},pause:function(){Zt=!0},onDetected:function(t){d.subscribe("detected",t)},offDetected:function(t){d.unsubscribe("detected",t)},onProcessed:function(t){d.subscribe("processed",t)},offProcessed:function(t){d.unsubscribe("processed",t)},setReaders:function(t){$t?$t.setReaders(t):te&&ue.length>0&&ue.forEach(function(e){return e.worker.postMessage({cmd:"setReaders",readers:t})})},registerResultCollector:function(t){t&&"function"==typeof t.addResult&&(ee=t)}};function ce(t){!function(t){Yt=t||new p.a({x:Xt.width,y:Xt.height});0;Jt=[{x:0,y:0},{x:0,y:Yt.size.y},{x:Yt.size.x,y:Yt.size.y},{x:Yt.size.x,y:0}],Kt=new oe.a(Yt,re.locator)}(t),$t=new wt(re.decoder,Yt)}function he(){var t=re.inputStream.target;if(t instanceof HTMLElement)return t;var e="string"==typeof t?t:"#interactive.viewport";return document.querySelector(e)}function le(t,e){t.forEach(function(t){t.x+=e.x,t.y+=e.y})}function fe(t,e){var r=t;if(t&&te){var n=Xt.topLeft;0===n.x&&0===n.y||function t(e,r){e.barcodes&&e.barcodes.forEach(function(e){return t(e,r)}),e.line&&le(e.line,r),e.box&&le(e.box,r),e.boxes&&e.boxes.forEach(function(t){return le(t,r)})}(t,n),function(t,e,r,n){e&&ee&&(t.barcodes?t.barcodes.forEach(function(t){var i=t.codeResult;i&&ee.addResult(e,r,n,i)}):t.codeResult&&ee.addResult(e,r,n,t.codeResult))}(t,e,Xt.canvasWidth,Xt.canvasHeight),r=t.barcodes||t}d.publish("processed",r),function(t){return t&&(!!t.codeResult||t.barcodes&&t.barcodes.some(function(t){return!!t.codeResult}))}(t)&&d.publish("detected",r)}function de(){var t=re.locate?Kt.locate():[Jt];fe($t.decodeFromBoundingBoxes(t),Yt.data)}function ve(){if(te)if(ue.length>0){var t=ue.find(function(t){return!t.busy});if(!t)return;var e=t.imageData;Qt.grab(e)&&(t.busy=!0,t.worker.postMessage({cmd:"process",imageData:e},[e.buffer]))}else Qt.grab(Yt.data)&&de();else de()}function _e(e){var r,n,i=(r=t||"",n=new Blob(["(".concat(pe.toString(),")(").concat(r,");")],{type:"text/javascript"}),window.URL.createObjectURL(n)),a={worker:new Worker(i),imageData:new Uint8Array(Xt.width*Xt.height),busy:!0};a.worker.onmessage=function(t){var r=t.data;"initialized"===r.event?(URL.revokeObjectURL(i),a.busy=!1,a.imageData=new Uint8Array(r.imageData),e(a)):"processed"===r.event?(a.busy=!1,a.imageData=new Uint8Array(r.imageData),fe(r.result,a.imageData)):r.event},a.worker.postMessage({cmd:"init",size:{x:Xt.width,y:Xt.height},imageData:a.imageData,config:m(re,{inputStream:{target:null}})},[a.imageData.buffer])}function pe(t){var e,r,n=self;!t||(e=t().default)?self.onmessage=function(t){var i=t.data;if("init"===i.cmd){var a=i.config;a.numOfWorkers=0,r=new e.ImageWrapper({x:i.size.x,y:i.size.y},new Uint8Array(i.imageData)),e.init(a,function(){return n.postMessage({event:"initialized",imageData:r.data},[r.data.buffer])},r),e.onProcessed(function(t){return n.postMessage({event:"processed",imageData:r.data,result:t},[r.data.buffer])})}else"process"===i.cmd?(r.data=new Uint8Array(i.imageData),e.start()):"setReaders"===i.cmd&&e.setReaders(i.readers)}:n.postMessage({event:"error",message:"Quagga could not be created"})}function ge(t,e){var r=t-ue.length;if(!(r>0))return r<0&&(ue.slice(r).forEach(function(t){t.worker.terminate()}),ue=ue.slice(0,r)),e&&e();for(var n=0;n=t&&e&&e()})}}])});
\ No newline at end of file
diff --git a/dist/quagga.node.js b/dist/quagga.node.js
new file mode 100644
index 00000000..77b1e486
--- /dev/null
+++ b/dist/quagga.node.js
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("ndarray"),require("get-pixels")):"function"==typeof define&&define.amd?define("Quagga",["ndarray","get-pixels"],t):"object"==typeof exports?exports.Quagga=t(require("ndarray"),require("get-pixels")):e.Quagga=t(e.ndarray,e["get-pixels"])}(global,function(e,t){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=21)}([function(e,t){e.exports=function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}},function(e,t){function r(e,t){for(var r=0;r=0,a=i&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,e.exports=r(18),i)n.regeneratorRuntime=a;else try{delete n.regeneratorRuntime}catch(e){n.regeneratorRuntime=void 0}},function(e,t){!function(t){"use strict";var r,n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag",c="object"==typeof e,h=t.regeneratorRuntime;if(h)c&&(e.exports=h);else{(h=t.regeneratorRuntime=c?e.exports:{}).wrap=b;var l="suspendedStart",f="suspendedYield",d="executing",v="completed",_={},p={};p[o]=function(){return this};var g=Object.getPrototypeOf,y=g&&g(g(z([])));y&&y!==n&&i.call(y,o)&&(p=y);var m=C.prototype=x.prototype=Object.create(p);k.prototype=m.constructor=C,C.constructor=k,C[u]=k.displayName="GeneratorFunction",h.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===k||"GeneratorFunction"===(t.displayName||t.name))},h.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,C):(e.__proto__=C,u in e||(e[u]="GeneratorFunction")),e.prototype=Object.create(m),e},h.awrap=function(e){return{__await:e}},A(S.prototype),S.prototype[s]=function(){return this},h.AsyncIterator=S,h.async=function(e,t,r,n){var i=new S(b(e,t,r,n));return h.isGeneratorFunction(t)?i:i.next().then(function(e){return e.done?e.value:i.next()})},A(m),m[u]="Generator",m[o]=function(){return this},m.toString=function(){return"[object Generator]"},h.keys=function(e){var t=[];for(var r in e)t.push(r);return t.reverse(),function r(){for(;t.length;){var n=t.pop();if(n in e)return r.value=n,r.done=!1,r}return r.done=!0,r}},h.values=z,R.prototype={constructor:R,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=r,this.done=!1,this.delegate=null,this.method="next",this.arg=r,this.tryEntries.forEach(O),!e)for(var t in this)"t"===t.charAt(0)&&i.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=r)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,i){return s.type="throw",s.arg=e,t.next=n,i&&(t.method="next",t.arg=r),!!i}for(var a=this.tryEntries.length-1;a>=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=i.call(o,"catchLoc"),c=i.call(o,"finallyLoc");if(u&&c){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&i.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),O(r),_}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;O(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:z(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=r),_}}}function b(e,t,r,n){var i=t&&t.prototype instanceof x?t:x,a=Object.create(i.prototype),o=new R(n||[]);return a._invoke=function(e,t,r){var n=l;return function(i,a){if(n===d)throw new Error("Generator is already running");if(n===v){if("throw"===i)throw a;return I()}for(r.method=i,r.arg=a;;){var o=r.delegate;if(o){var s=E(o,r);if(s){if(s===_)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===l)throw n=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=d;var u=w(e,t,r);if("normal"===u.type){if(n=r.done?v:f,u.arg===_)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n=v,r.method="throw",r.arg=u.arg)}}}(e,r,o),a}function w(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function x(){}function k(){}function C(){}function A(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function S(e){var t;this._invoke=function(r,n){function a(){return new Promise(function(t,a){!function t(r,n,a,o){var s=w(e[r],e,n);if("throw"!==s.type){var u=s.arg,c=u.value;return c&&"object"==typeof c&&i.call(c,"__await")?Promise.resolve(c.__await).then(function(e){t("next",e,a,o)},function(e){t("throw",e,a,o)}):Promise.resolve(c).then(function(e){u.value=e,a(u)},function(e){return t("throw",e,a,o)})}o(s.arg)}(r,n,t,a)})}return t=t?t.then(a,a):a()}}function E(e,t){var n=e.iterator[t.method];if(n===r){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=r,E(e,t),"throw"===t.method))return _;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return _}var i=w(n,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,_;var a=i.arg;return a?a.done?(t[e.resultName]=a.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=r),t.delegate=null,_):a:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,_)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function O(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function R(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function z(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,a=function t(){for(;++n1&&(t.strokeStyle=r,t.fillStyle=r,t.lineWidth=n,t.beginPath(),t.moveTo(e[0].x,e[0].y),e.slice(1).forEach(function(e){var r=e.x,n=e.y;return t.lineTo(r,n)}),t.closePath(),t.stroke())},drawImage:function(e,t,r,n){var i=n.getImageData(0,0,t,r),a=i.data,o=0|e.length,s=0|a.length;if(s/o!=4)return!1;for(;o--;){var u=e[o];a[--s]=255,a[--s]=u,a[--s]=u,a[--s]=u}return n.putImageData(i,0,0),!0}},h=function(){function e(t){i()(this,e),u()(this,"_canvas",void 0),u()(this,"_context",void 0),u()(this,"_config",void 0),u()(this,"_capacity",void 0),u()(this,"_capture",void 0),u()(this,"_results",void 0),this._results=new Array,this._config=t,this._capacity=t.capacity||20,this._capture=!0===t.capture,this._capture&&(this._canvas=document.createElement("canvas"),this._context=this._canvas.getContext("2d"))}return o()(e,[{key:"addResult",value:function(e,t,r,n){if(n&&this._capacity&&!this._contains(n)&&this._passesFilter(n)){var i={codeResult:n};this._capacity--,this._capture&&(this._canvas.width=t,this._canvas.height=r,c.drawImage(e,t,r,this._context),i.frame=this._canvas.toDataURL()),this._results.push(i)}}},{key:"getResults",value:function(){return this._results}},{key:"_contains",value:function(e){return this._config.blacklist&&this._config.blacklist.some(function(t){return Object.keys(t).every(function(r){return t[r]===e[r]})})}},{key:"_passesFilter",value:function(e){return"function"!=typeof this._config.filter||this._config.filter(e)}}]),e}(),l={},f=function(){function e(){i()(this,e)}return o()(e,null,[{key:"subscribe",value:function(e,t,r){var n;if("function"==typeof t)n={callback:t,async:r};else if(!(n=t).callback)throw"Callback was not specified on options";d(e).subscriptions.push(n)}},{key:"publish",value:function(e,t){var r=d(e),n=r.subscriptions;n.filter(function(e){return!!e.once}).forEach(function(e){return v(e,t)}),r.subscriptions=n.filter(function(e){return!e.once}),r.subscriptions.forEach(function(e){return v(e,t)})}},{key:"once",value:function(t,r,n){e.subscribe(t,{callback:r,async:n,once:!0})}},{key:"unsubscribe",value:function(e,t){if(e){var r=d(e);r.subscriptions=r&&t?r.subscriptions.filter(function(e){return e.callback!==t}):[]}else l={}}}]),e}();function d(e){return l[e]||(l[e]={subscriptions:[]}),l[e]}function v(e,t){e.async?setTimeout(function(){e.callback(t)},4):e.callback(t)}function _(e,t){var r=e[0],n=e[1],i=e[2],a=i*n,o=a*(1-Math.abs(r/60%2-1)),s=i-a,u=0,c=0,h=0;return r<60?(u=a,c=o):r<120?(u=o,c=a):r<180?(c=a,h=o):r<240?(c=o,h=a):r<300?(u=o,h=a):r<360&&(u=a,h=o),(t=t||[0,0,0])[0]=255*(u+s)|0,t[1]=255*(c+s)|0,t[2]=255*(h+s)|0,t}var p=function(){function e(t,r,n,a){i()(this,e),u()(this,"data",void 0),u()(this,"size",void 0),r?this.data=r:(this.data=new(n||Uint8Array)(t.x*t.y),a&&this.data.fill(0)),this.size=t}return o()(e,[{key:"inImageWithBorder",value:function(e,t){return e.x>=t&&e.y>=t&&e.x0){var h=n[c-1];h.m00+=1,h.m01+=o,h.m10+=u,h.m11+=u*o,h.m02+=s,h.m20+=u*u}}for(var l=Math.PI,f=l/4,d=0;d=0?f:-f)+l;v.theta=(180*b/l+90)%180-90,v.theta<0&&(v.theta+=180),v.rad=b>l?b-l:b,v.x=Math.cos(b),v.y=Math.sin(b),i.push(v)}}return i}},{key:"show",value:function(e,t){var r=this.size.y,n=this.size.x,i=e.getImageData(0,0,n,r),a=i.data,o=0;t||(t=1);for(var s=0;s360)&&(t=360);for(var c=this.data.length;c--;){i[0]=this.data[c]*t;var h=i[0]<=0?a:i[0]>=360?o:_(i);u[4*c+0]=h[0],u[4*c+1]=h[1],u[4*c+2]=h[2],u[4*c+3]=255}e.putImageData(s,r,n)}}]),e}(),g=r(8),y=r.n(g);function m(){for(var e=function(e){return e&&"object"===y()(e)},t=arguments.length,r=new Array(t),n=0;nr)return Number.MAX_VALUE;n+=l}return n/a}},{key:"_correctBars",value:function(e,t,r){for(var n=r.length,i=0;n--;)(i=e[r[n]]*(1-(1-t)/2))>1&&(e[r[n]]=i)}},{key:"decodePattern",value:function(e){this._row=e;var t=this.decode();return null===t?(this._row.reverse(),(t=this.decode())&&(t.direction=b.Reverse,t.start=this._row.length-t.start,t.end=this._row.length-t.end)):t.direction=b.Forward,t&&(t.format=this.FORMAT),t}},{key:"_fillCounters",value:function(e,t,r){var n=new Array,i=0;n[i]=0;for(var a=e;aa)return null;var l=z[i.code];return l&&(i.correction.bar=this._calculateCorrection(l,r,I),i.correction.space=this._calculateCorrection(l,r,W)),i}r[++s]=1,o=o?0:1}return null}},{key:"_correct",value:function(e,t){this._correctBars(e,t.bar,I),this._correctBars(e,t.space,W)}},{key:"_findStart",value:function(){for(var e,t=[0,0,0,0,0,0],r=this._nextSet(this._row),n={error:Number.MAX_VALUE,code:-1,start:0,end:0,correction:{bar:1,space:1}},i=this.AVERAGE_CODE_ERROR,a=0,o=0,s=r;s=n}},{key:"_findNextWidth",value:function(e,t){for(var r=Number.MAX_VALUE,n=0;nt&&(r=e[n]);return r}},{key:"_toPattern",value:function(e){for(var t,r=e.length,n=0,i=r,a=0;i>3;){n=this._findNextWidth(e,n),i=0,t=0;for(var o=0;on&&(t|=1<0;s++)if(e[s]>n&&(i--,2*e[s]>=a))return-1;return t}}return-1}},{key:"_findStart",value:function(){for(var e,t=this._nextSet(this._row),r=t,n=new Uint16Array(9),i=0,a=0,o=t;o1&&V.some(function(e){return e===t}))break}while(nthis._counters.length?this._counters.length:n;var a=e.start+this._sumCounters(e.startCounter,n-8);return{code:r.join(""),start:e.start,end:a,startInfo:e,decodedCodes:r}}},{key:"_verifyWhitespace",value:function(e,t){return(e-1<=0||this._counters[e-1]>=this._calculatePatternLength(e)/2)&&(t+8>=this._counters.length||this._counters[t+7]>=this._calculatePatternLength(t)/2)}},{key:"_calculatePatternLength",value:function(e){for(var t=0,r=e;r=0;o--){var s=2==(1&o)?r.bar:r.space,u=1==(1&a)?s.wide:s.narrow;u.size+=this._counters[n+o],u.counts++,a>>=1}n+=8}return["space","bar"].forEach(function(e){var t=r[e];t.wide.min=Math.floor((t.narrow.size/t.narrow.counts+t.wide.size/t.wide.counts)/2),t.narrow.max=Math.ceil(t.wide.min),t.wide.max=Math.ceil((2*t.wide.size+1.5)/t.wide.counts)}),r}},{key:"_charToPattern",value:function(e){for(var t=e.charCodeAt(0),r=0;r=0;o--){var s=0==(1&o)?r.bar:r.space,u=1==(1&a)?s.wide:s.narrow,c=this._counters[n+o];if(cu.max)return!1;a>>=1}n+=8}return!0}},{key:"_patternToChar",value:function(e){for(var t=0;tn&&(n=a),athis._counters.length)return-1;for(var r=this._computeAlternatingThreshold(e,t),n=this._computeAlternatingThreshold(e+1,t),i=64,a=0,o=0;o<7;o++){var s=0==(1&o)?r:n;this._counters[e+o]>s&&(a|=i),i>>=1}return a}},{key:"_sumCounters",value:function(e,t){for(var r=0,n=e;na?null:i}r[++s]=1,o=o?0:1}return null}},{key:"_findStart",value:function(){for(var e,t=this._nextSet(this._row);!e;){if(!(e=this._findPattern(this.START_PATTERN,t,0,!0)))return null;var r=e.start-(e.end-e.start);if(r>=0&&this._matchRange(r,e.start,0))return e;t=e.end,e=null}return null}},{key:"_verifyTrailingWhitespace",value:function(e){var t=e.end+(e.end-e.start);return t=this.CODE_G_START?(e.code-=this.CODE_G_START,n|=1<<5-i):n|=0<<5-i,t.push(e.code),r.push(e)}var a=this._calculateFirstDigit(n);if(null===a)return null;if(t.unshift(a),null===(e=this._findPattern(this.MIDDLE_PATTERN,e.end,1,!1)))return null;r.push(e);for(var o=0;o<6;o++){if(!(e=this._decodeCode(e.end,this.CODE_G_START)))return null;r.push(e),t.push(e.code)}return e}},{key:"decode",value:function(){var e=new Array,t=new Array,r={},n=this._findStart();if(!n)return null;var i={code:n.code,start:n.start,end:n.end};if(t.push(i),!(i=this._decodePayload(i,e,t)))return null;if(!(i=this._findEnd(i.end,0)))return null;if(t.push(i),!this._checksum(e))return null;if(this.supplements.length>0){var a=this._decodeExtensions(i.end);if(!a)return null;var o=a.decodedCodes[a.decodedCodes.length-1],s={start:o.start+((o.end-o.start)/2|0),end:o.end};if(!this._verifyTrailingWhitespace(s))return null;r={supplement:a,code:e.join("")+a.code}}return function(e){for(var t=1;t=0;r-=2)t+=e[r];t*=3;for(var n=e.length-1;n>=0;n-=2)t+=e[n];return t%10==0}}]),t}(R),$=function(e){function t(e,r){var n;return i()(this,t),(n=A()(this,E()(t).call(this,e,r)))._format="ean_8",n}return O()(t,e),o()(t,[{key:"_decodePayload",value:function(e,t,r){for(var n=0;n<4;n++){if(!(e=this._decodeCode(e.end,this.CODE_G_START)))return null;t.push(e.code),r.push(e)}if(null===(e=this._findPattern(this.MIDDLE_PATTERN,e.end,1,!1)))return null;r.push(e);for(var i=0;i<4;i++){if(!(e=this._decodeCode(e.end,this.CODE_G_START)))return null;r.push(e),t.push(e.code)}return e}}]),t}(J),ee=function(e){function t(e,r){var n;return i()(this,t),(n=A()(this,E()(t).call(this,e,r)))._format="ean_2",n}return O()(t,e),o()(t,[{key:"decode",value:function(e,t){var r,n=e.length,i=new Array,a=new Array,o=t,s=0;this._row=e;for(var u=0;u<2&&o=this.CODE_G_START&&(s|=1<<1-u),1!==u&&(o=this._nextSet(this._row,r.end),o=this._nextUnset(this._row,o))}return 2!==i.length||parseInt(i.join(""))%4!==s?null:{code:i.join(""),decodedCodes:a,end:r.end}}}]),t}(J),te=function(e){function t(e,r){var n;return i()(this,t),(n=A()(this,E()(t).call(this,e,r)))._format="ean_5",n}return O()(t,e),o()(t,[{key:"CHECK_DIGIT_ENCODINGS",get:function(){return[24,20,18,17,12,6,3,10,9,5]}}]),o()(t,[{key:"decode",value:function(e,t){var r,n=e.length,i=new Array,a=new Array,o=0,s=t;this._row=e;for(var u=0;u<5&&s=this.CODE_G_START&&(o|=1<<4-u),4!==u&&(s=this._nextSet(this._row,r.end),s=this._nextUnset(this._row,s))}return 5!==i.length?null:this._extensionChecksum(i)!==this._determineCheckDigit(o)?null:{code:i.join(""),decodedCodes:a,end:r.end}}},{key:"_determineCheckDigit",value:function(e){for(var t=0;t<10;t++)if(e===this.CHECK_DIGIT_ENCODINGS[t])return t;return null}},{key:"_extensionChecksum",value:function(e){for(var t=e.length,r=0,n=t-2;n>=0;n-=2)r+=e[n];r*=3;for(var i=t-1;i>=0;i-=2)r+=e[i];return(r*=3)%10}}]),t}(J),re=function(e){function t(e,r){var n;return i()(this,t),(n=A()(this,E()(t).call(this,e,r)))._format="upc_a",n}return O()(t,e),o()(t,[{key:"decode",value:function(){var e=G()(E()(t.prototype),"decode",this).call(this);return e&&e.code&&13===e.code.length&&"0"===e.code.charAt(0)?(e.code=e.code.substring(1),e):null}}]),t}(J),ne=[[56,52,50,49,44,38,35,42,41,37],[7,11,13,14,19,25,28,21,22,26]],ie=function(e){function t(e,r){var n;return i()(this,t),(n=A()(this,E()(t).call(this,e,r)))._format="upc_e",n}return O()(t,e),o()(t,[{key:"STOP_PATTERN",get:function(){return[1/6*7,1/6*7,1/6*7,1/6*7,1/6*7,1/6*7]}}]),o()(t,[{key:"_decodePayload",value:function(e,t,r){for(var n=0,i=0;i<6;i++){if(!(e=this._decodeCode(e.end)))return null;e.code>=this.CODE_G_START&&(e.code=e.code-this.CODE_G_START,n|=1<<5-i),t.push(e.code),r.push(e)}return this._determineParity(n,t)?e:null}},{key:"_determineParity",value:function(e,t){for(var r=0;r>2,n=e.start-10*r;if(n>=0&&this._matchRange(n,e.start,0))return e;t=e.end,e=null}return null}},{key:"_verifyTrailingWhitespace",value:function(e){var t=e.end+(e.end-e.start)/2;return t=0&&this._matchRange(n,e.start,0))return e;t=e.end,e=null}return null}},{key:"_verifyTrailingWhitespace",value:function(e){var t=e.end+(e.end-e.start)/2;return t4)return-1;if(0==(1&a))for(var s=0;s="a"&&i<="d"){if(n>t-2)return null;var a=e[++n],o=a.charCodeAt(0),s=void 0;switch(i){case"a":if(!(a>="A"&&a<="Z"))return null;s=String.fromCharCode(o-64);break;case"b":if(a>="A"&&a<="E")s=String.fromCharCode(o-38);else if(a>="F"&&a<="J")s=String.fromCharCode(o-11);else if(a>="K"&&a<="O")s=String.fromCharCode(o+16);else if(a>="P"&&a<="S")s=String.fromCharCode(o+43);else{if(!(a>="T"&&a<="Z"))return null;s=String.fromCharCode(127)}break;case"c":if(a>="A"&&a<="O")s=String.fromCharCode(o-32);else{if("Z"!==a)return null;s=":"}break;case"d":if(!(a>="A"&&a<="Z"))return null;s=String.fromCharCode(o+32)}r.push(s)}else r.push(i)}return r}},{key:"_verifyChecksums",value:function(e){return this._matchCheckChar(e,e.length-2,20)&&this._matchCheckChar(e,e.length-1,15)}},{key:"_matchCheckChar",value:function(e,t,r){var n=e.slice(0,t),i=n.length,a=n.reduce(function(e,t,n){return e+((-1*n+(i-1))%r+1)*ve.indexOf(t.charCodeAt(0))},0);return ve[a%47]===e[t].charCodeAt(0)}}]),t}(R)};function ge(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}!function(e){e[e.Up=1]="Up",e[e.Down=-1]="Down"}(Y||(Y={}));var ye,me=function(e,t,r){var n,i,a=0|t.x,o=0|t.y,s=0|r.x,u=0|r.y,c=Math.abs(u-o)>Math.abs(s-a),h=[],l=e.data,f=e.size.x,d=255,v=0;function _(e,t){i=l[t*f+e],d=iv?i:v,h.push(i)}c&&(n=a,a=o,o=n,n=s,s=u,u=n),a>s&&(n=a,a=s,s=n,n=o,o=u,u=n);for(var p=s-a,g=Math.abs(u-o),y=p/2|0,m=o,b=oi?Y.Up:Y.Down;a.push({pos:0,val:n[0]});for(var h=0;ho&&n[h+1]>.5*i?Y.Up:c)&&(a.push({pos:h,val:n[h]}),c=d)}a.push({pos:n.length,val:n[n.length-1]});for(var v=a[0].pos;vi?0:1;for(var _=1;_a[_].val?a[_].val+(a[_+1].val-a[_].val)/3*2|0:a[_+1].val+(a[_].val-a[_+1].val)/3|0;for(var p=a[_].pos;po?0:1}return function(e){for(var t=1;t1&&(!this._inputImageWrapper.inImageWithBorder(e[0],0)||!this._inputImageWrapper.inImageWithBorder(e[1],0));)r(-(n>>=1));return e}},{key:"_getLine",value:function(e){return[{x:(e[1].x+e[0].x)/2,y:(e[1].y+e[0].y)/2},{x:(e[3].x+e[2].x)/2,y:(e[3].y+e[2].y)/2}]}},{key:"_tryDecode",value:function(e){var t=me(this._inputImageWrapper,e[0],e[1]);t=be(t);var r=null;return this._barcodeReaders.some(function(e){return!!(r=e.decodePattern(t.line))}),r?{codeResult:r,barcodeLine:t}:null}},{key:"_tryDecodeBruteForce",value:function(e,t,r){for(var n=Math.sqrt(Math.pow(e[1].x-e[0].x,2)+Math.pow(e[1].y-e[0].y,2)),i=Math.sin(r),a=Math.cos(r),o=1;o<16;o++){var s=n/16*o*(o%2==0?-1:1);t[0].y+=s*i,t[0].x-=s*a,t[1].y+=s*i,t[1].x-=s*a;var u=this._tryDecode(t);if(u)return u}return null}},{key:"_printFrequency",value:function(e){var t=this._frequencyCanvas.getContext("2d");this._frequencyCanvas.width=e.length,this._frequencyCanvas.height=256,t.beginPath(),t.strokeStyle="blue";for(var r=0;r0&&(i=s,console.log("WARNING: Constraint 'minAspectRatio' is deprecated; Use 'aspectRatio' instead")),void 0!==u&&(n=u,console.log("WARNING: Constraint 'facing' is deprecated. Use 'facingMode' instead'")),{audio:!1,video:a&&n?{width:t,height:r,aspectRatio:i,deviceId:a}:{width:t,height:r,facingMode:n,aspectRatio:i,deviceId:a}}}};function Oe(e){var t=e.videoWidth,r=e.videoHeight;return new Promise(function(e,n){var i=10;!function a(){i>0?t>10&&r>10?e():window.setTimeout(a,500):n("Unable to play video stream. Is webcam working?"),i--}()})}var Re=r(19),ze=function(){function e(t){i()(this,e),u()(this,"_inputStream",void 0),u()(this,"_streamConfig",void 0),u()(this,"_data",void 0),u()(this,"_canvasData",void 0),u()(this,"_grayData",void 0),u()(this,"_canvasImageArray",void 0),u()(this,"_grayImageArray",void 0),u()(this,"_targetImageArray",void 0),u()(this,"_canvasHeight",void 0),u()(this,"_canvasWidth",void 0),u()(this,"_videoHeight",void 0),u()(this,"_videoWidth",void 0),u()(this,"_height",void 0),u()(this,"_width",void 0),u()(this,"_stepSizeX",void 0),u()(this,"_stepSizeY",void 0),u()(this,"_topLeft",void 0),this._inputStream=t,this._streamConfig=t.config,this._videoHeight=t.realHeight,this._videoWidth=t.realWidth,this._canvasHeight=t.canvasHeight,this._canvasWidth=t.canvasWidth,this._width=t.width,this._height=t.height,this._topLeft=t.topLeft,this._data=new Uint8Array(this._width*this._height),this._grayData=new Uint8Array(this._videoWidth*this._videoHeight),this._canvasData=new Uint8Array(this._canvasWidth*this._canvasHeight),this._grayImageArray=Re(this._grayData,[this._videoHeight,this._videoWidth]).transpose(1,0),this._canvasImageArray=Re(this._canvasData,[this._canvasHeight,this._canvasWidth]).transpose(1,0),this._targetImageArray=this._canvasImageArray.hi(this._topLeft.x+this._width,this._topLeft.y+this._height).lo(this._topLeft.x,this._topLeft.y),this._stepSizeX=this._videoWidth/this._canvasWidth,this._stepSizeY=this._videoHeight/this._canvasHeight,console.log("FrameGrabber",JSON.stringify({videoSize:this._grayImageArray.shape,canvasSize:this._canvasImageArray.shape,stepSize:[this._stepSizeX,this._stepSizeY],size:this._targetImageArray.shape,topLeft:this._topLeft}))}return o()(e,[{key:"grab",value:function(e){this._data=e;var t=this._inputStream.getFrame();return!!t&&(this._scaleAndCrop(t),!0)}},{key:"_scaleAndCrop",value:function(e){this._computeGray(e.data);for(var t=0;te._height?e._config.size:e._width*e._config.size/e._height|0:e._width,e._canvasHeight=e._calculatedHeight=e._config.size?e._width>e._height?e._height*e._config.size/e._width|0:e._config.size:e._height,setTimeout(function(){return e.trigger("canrecord",[])},0)},this._offset,this._size,this._config.sequence)}},{key:"realHeight",get:function(){return this._height}},{key:"realWidth",get:function(){return this._width}},{key:"config",get:function(){return this._config},set:function(e){this._config=function(e){for(var t=1;tt?this._config.size:e*this._config.size/t|0:e,this._canvasHeight=this._calculatedHeight=this._config.size?e>t?t*this._config.size/e|0:this._config.size:t}},{key:"realHeight",get:function(){return this._video.videoHeight}},{key:"realWidth",get:function(){return this._video.videoWidth}},{key:"config",get:function(){return this._config},set:function(e){this._config=function(e){for(var t=1;t>1];t0&&(r=Math.abs(e[t]-c)>Math.abs(e[t-1]-c)?0|e[t-1]:0|e[t]),c/ra[s-1]/a[s]?{x:r,y:r}:null}return h(function(e,t){if(e===t)return Ne(e);for(var r=e>t?e:t,n=e>t?t:e,i=new Array,a=new Array,o=1;o*o<=n;o++)if(r%o==0&&n%o==0){i.push(o);var s=n/o|0;o!==s&&r%s==0&&a.unshift()}return i.concat(a)}(r,n))||h(Ne(i))||h(Ne(c*u))}function Be(e,t){var r=e.width,n=e.height,i=t.halfSample?1:0,a=e.config;if(a&&a.area){var o=function(e,t,r){var n={width:e,height:t},i=Object.keys(r).reduce(function(e,t){var i=r[t],a=function(e){return{value:parseFloat(e),unit:e.indexOf("%")===e.length-1?"%":e.indexOf("px")===e.length-2?"px":"%"}}(i),o=Fe[t](a,n);return e[t]=o,e},{});return{topLeft:{x:i.left,y:i.top},width:i.right-i.left,height:i.bottom-i.top}}(r,n,a.area);e.topLeft=o.topLeft,e.setCanvasSize(r,n),r=o.width,n=o.height}var s={x:r>>i,y:n>>i},u=He(t.patchSize,s);if(e.width=(s.x/u.x<this._threshold}},{key:"moments",get:function(){return this._moments}}]),e}();function qe(e,t){var r=e.x,n=e.y;return{x:t[0]*r+t[2]*n,y:t[1]*r+t[3]*n}}function Xe(e,t){t||(t=8);var r=8-t,n=function(e,t){t||(t=8);for(var r=e.data,n=8-t,i=new Int32Array(1<>n]++;return i}(e,t),i=[0],a=(1<n[e]?r:e},0)<0){o=o-1|0;n[r+o|0]=(n[e+o|0]|0)-(n[t+o|0]|0)|0}}function u(e,t,r){e=e|0;t=t|0;r=r|0;var o=0;o=a(i,i)|0;while((o|0)>0){o=o-1|0;n[r+o|0]=n[e+o|0]|0|(n[t+o|0]|0)|0}}function c(e){e=e|0;var t=0,r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;t=(t|0)+(n[e+r|0]|0)|0}return t|0}function h(e,t){e=e|0;t=t|0;var r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;n[e+r|0]=t}}function l(e,t){e=e|0;t=t|0;var r=0,a=0,o=0,s=0,u=0,c=0,h=0,l=0;for(r=1;(r|0)<(i-1|0);r=r+1|0){l=l+i|0;for(a=1;(a|0)<(i-1|0);a=a+1|0){s=l-i|0;u=l+i|0;c=a-1|0;h=a+1|0;o=(n[e+s+c|0]|0)+(n[e+s+h|0]|0)+(n[e+l+a|0]|0)+(n[e+u+c|0]|0)+(n[e+u+h|0]|0)|0;if((o|0)>(0|0)){n[t+l+a|0]=1}else{n[t+l+a|0]=0}}}return}function f(e,t){e=e|0;t=t|0;var r=0;r=a(i,i)|0;while((r|0)>0){r=r-1|0;n[t+r|0]=n[e+r|0]|0}}function d(e){e=e|0;var t=0,r=0;for(t=0;(t|0)<(i-1|0);t=t+1|0){n[e+t|0]=0;n[e+r|0]=0;r=r+i-1|0;n[e+r|0]=0;r=r+1|0}for(t=0;(t|0)<(i|0);t=t+1|0){n[e+r|0]=0;r=r+1|0}}function v(){var e=0,t=0,r=0,n=0,v=0,_=0;t=a(i,i)|0;r=t+t|0;n=r+t|0;h(n,0);d(e);do{o(e,t);l(t,r);s(e,r,r);u(n,r,n);f(t,e);v=c(e)|0;_=(v|0)==0|0}while(!_)}return{skeletonize:v}},ht=function(){function e(t,r){i()(this,e),u()(this,"_config",void 0),u()(this,"_inputImageWrapper",void 0),u()(this,"_currentImageWrapper",void 0),u()(this,"_skelImageWrapper",void 0),u()(this,"_subImageWrapper",void 0),u()(this,"_labelImageWrapper",void 0),u()(this,"_binaryImageWrapper",void 0),u()(this,"_patchGrid",void 0),u()(this,"_patchLabelGrid",void 0),u()(this,"_imageToPatchGrid",void 0),u()(this,"_patchSize",void 0),u()(this,"_binaryContext",void 0),u()(this,"_numPatches",void 0),u()(this,"_skeletonizer",void 0),this._config=r,this._inputImageWrapper=t,this._numPatches={x:0,y:0},this._initBuffers(),this._initCanvas()}return o()(e,[{key:"locate",value:function(){this._config.halfSample&&function(e,t){for(var r=e.data,n=e.size.x,i=t.data,a=r.length,o=n>>1,s=0,u=n,c=0;u>2,c++,s+=2,u+=2;s+=n,u+=n}}(this._inputImageWrapper,this._currentImageWrapper),this._binarizeImage();var e=this._findPatches();if(e.lengthu&&(u=t),rc&&(c=r)})});var h=[{x:o,y:s},{x:u,y:s},{x:u,y:c},{x:o,y:c}];return h=h.map(function(e){return qe(e,a)}),this._config.halfSample&&(h=h.map(function(e){var t=e.x,r=e.y;return{x:2*t,y:r*=2}})),h}},{key:"_binarizeImage",value:function(){var e,t,r,n;e=this._currentImageWrapper,t=this._binaryImageWrapper,r=Xe(e),n=t.data,e.data.forEach(function(e,t){n[t]=e0&&t[e-1]++}),t.map(function(e,t){return{value:e,index:t}}).filter(function(e){return e.value>=5}).sort(function(e,t){return t.value-e.value}).map(function(e){return e.index+1})}},{key:"_findBoxes",value:function(e,t){var r=this,n=new Array;return e.forEach(function(e){var t=new Array;r._patchLabelGrid.data.forEach(function(n,i){n===e&&t.push(r._imageToPatchGrid[i])});var i=r._boxFromPatches(t);i&&n.push(i)}),n}},{key:"_similarMoments",value:function(e){return Ve.clusterize(e,.9).reduce(function(e,t){var r=t.moments.length;return r>e.count?{item:t,count:r}:e},{item:{moments:[]},count:0}).item.moments}},{key:"_skeletonize",value:function(e,t){this._binaryImageWrapper.subImageAsCopy(this._subImageWrapper,e,t),this._skeletonizer.skeletonize()}},{key:"_describePatch",value:function(e,t,r,n){if(e.length>1){var i=Math.ceil(this._patchSize.x/3),a=e.filter(function(e){return e.m00>i});if(a.length>1){var o=this._similarMoments(a),s=0|o.length;if(s>1&&s<<2>=3*a.length&&s<<2>e.length){var u=o.reduce(function(e,t){return e+t.rad},0)/s;return{index:t,pos:{x:r,y:n},box:[{x:r,y:n},{x:r+this._subImageWrapper.size.x,y:n},{x:r+this._subImageWrapper.size.x,y:n+this._subImageWrapper.size.y},{x:r,y:n+this._subImageWrapper.size.y}],moments:o,rad:u,x:Math.cos(u),y:Math.sin(u)}}}}return null}},{key:"_notYetProcessed",value:function(){for(var e=0;e.95&&r._trace(u,t)}})}}},{key:"_rasterizeAngularSimilarity",value:function(e){var t=this,r=0;this._patchGrid.data.fill(0),this._patchLabelGrid.data.fill(0),this._imageToPatchGrid.fill(null),e.forEach(function(e){t._imageToPatchGrid[e.index]=e,t._patchGrid.data[e.index]=1}),this._patchGrid.zeroBorder();for(var n=0;(n=this._notYetProcessed())=t&&(t+=e,yt()),window.requestAnimationFrame(r))}(performance.now())):yt()},stop:function(){tt=!0,wt(0),"LiveStream"===ut.inputStream.type&&(Pe.release(),$e.clearEventHandlers())},decodeSingle:function(e,t){var r=this;e=m({inputStream:{type:"ImageStream",sequence:!1,size:800,src:e.src},numOfWorkers:1,locator:{halfSample:!1}},e),this.init(e,function(){f.once("processed",function(e){r.stop(),t.call(null,e)},!0),r.start()})},pause:function(){tt=!0},onDetected:function(e){f.subscribe("detected",e)},offDetected:function(e){f.unsubscribe("detected",e)},onProcessed:function(e){f.subscribe("processed",e)},offProcessed:function(e){f.unsubscribe("processed",e)},setReaders:function(e){at?at.setReaders(e):ot&&ft.length>0&&ft.forEach(function(t){return t.worker.postMessage({cmd:"setReaders",readers:e})})},registerResultCollector:function(e){e&&"function"==typeof e.addResult&&(st=e)}};function dt(e){!function(e){rt=e||new p({x:$e.width,y:$e.height});0;it=[{x:0,y:0},{x:0,y:rt.size.y},{x:rt.size.x,y:rt.size.y},{x:rt.size.x,y:0}],nt=new ht(rt,ut.locator)}(e),at=new we(ut.decoder,rt)}function vt(){var e=ut.inputStream.target;if(e instanceof HTMLElement)return e;var t="string"==typeof e?e:"#interactive.viewport";return document.querySelector(t)}function _t(e,t){e.forEach(function(e){e.x+=t.x,e.y+=t.y})}function pt(e,t){var r=e;if(e&&ot){var n=$e.topLeft;0===n.x&&0===n.y||function e(t,r){t.barcodes&&t.barcodes.forEach(function(t){return e(t,r)}),t.line&&_t(t.line,r),t.box&&_t(t.box,r),t.boxes&&t.boxes.forEach(function(e){return _t(e,r)})}(e,n),function(e,t,r,n){t&&st&&(e.barcodes?e.barcodes.forEach(function(e){var i=e.codeResult;i&&st.addResult(t,r,n,i)}):e.codeResult&&st.addResult(t,r,n,e.codeResult))}(e,t,$e.canvasWidth,$e.canvasHeight),r=e.barcodes||e}f.publish("processed",r),function(e){return e&&(!!e.codeResult||e.barcodes&&e.barcodes.some(function(e){return!!e.codeResult}))}(e)&&f.publish("detected",r)}function gt(){var e=ut.locate?nt.locate():[it];pt(at.decodeFromBoundingBoxes(e),rt.data)}function yt(){if(ot)if(ft.length>0){var e=ft.find(function(e){return!e.busy});if(!e)return;var t=e.imageData;et.grab(t)&&(e.busy=!0,e.worker.postMessage({cmd:"process",imageData:t},[t.buffer]))}else et.grab(rt.data)&>();else gt()}function mt(e){var t,r,n=(t=__factorySource__||"",r=new Blob(["(".concat(bt.toString(),")(").concat(t,");")],{type:"text/javascript"}),window.URL.createObjectURL(r)),i={worker:new Worker(n),imageData:new Uint8Array($e.width*$e.height),busy:!0};i.worker.onmessage=function(t){var r=t.data;"initialized"===r.event?(URL.revokeObjectURL(n),i.busy=!1,i.imageData=new Uint8Array(r.imageData),e(i)):"processed"===r.event?(i.busy=!1,i.imageData=new Uint8Array(r.imageData),pt(r.result,i.imageData)):r.event},i.worker.postMessage({cmd:"init",size:{x:$e.width,y:$e.height},imageData:i.imageData,config:m(ut,{inputStream:{target:null}})},[i.imageData.buffer])}function bt(e){var t,r,n=self;!e||(t=e().default)?self.onmessage=function(e){var i=e.data;if("init"===i.cmd){var a=i.config;a.numOfWorkers=0,r=new t.ImageWrapper({x:i.size.x,y:i.size.y},new Uint8Array(i.imageData)),t.init(a,function(){return n.postMessage({event:"initialized",imageData:r.data},[r.data.buffer])},r),t.onProcessed(function(e){return n.postMessage({event:"processed",imageData:r.data,result:e},[r.data.buffer])})}else"process"===i.cmd?(r.data=new Uint8Array(i.imageData),t.start()):"setReaders"===i.cmd&&t.setReaders(i.readers)}:n.postMessage({event:"error",message:"Quagga could not be created"})}function wt(e,t){var r=e-ft.length;if(!(r>0))return r<0&&(ft.slice(r).forEach(function(e){e.worker.terminate()}),ft=ft.slice(0,r)),t&&t();for(var n=0;n=e&&t&&t()})}}])});
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9RdWFnZ2Evd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1F1YWdnYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy9Vc2Vycy9hZG9tcmF0Y2hldi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc3VwZXJQcm9wQmFzZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvL1VzZXJzL2Fkb21yYXRjaGV2L25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUtbW9kdWxlLmpzIiwid2VicGFjazovL1F1YWdnYS8vVXNlcnMvYWRvbXJhdGNoZXYvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvZXh0ZXJuYWwgXCJuZGFycmF5XCIiLCJ3ZWJwYWNrOi8vUXVhZ2dhL2V4dGVybmFsIFwiZ2V0LXBpeGVsc1wiIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vaW1hZ2UtZGVidWcudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2FuYWx5dGljcy9yZXN1bHQtY29sbGVjdG9yLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vZXZlbnRzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vaHN2MnJnYi50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2ltYWdlLXdyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9tZXJnZS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29uZmlnL2NvbmZpZy5ub2RlLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvYmFyY29kZS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlLTEyOC1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlLTM5LXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGUtMzktdmluLXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGFiYXItcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuLXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvZGVjb2Rlci9icmVzZW5oYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tOC1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tMi1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW4tNS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGMtcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvdXBjLWUtcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaTJvZjUtcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvMm9mNS1yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlLTkzLXJlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2luZGV4LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9jYW1lcmEtYWNjZXNzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9kZWNvZGVyL2JhcmNvZGUtZGVjb2Rlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL21lZGlhLWRldmljZXMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2lucHV0L2ZyYW1lLWdyYWJiZXIubm9kZS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW5wdXQtc3RyZWFtLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9pbWFnZS1zdHJlYW0ubm9kZS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvdmlkZW8tc3RyZWFtLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9saXZlLXN0cmVhbS50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW5wdXQtc3RyZWFtLXV0aWxzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vY2x1c3Rlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvbG9jYXRvci9iYXJjb2RlLWxvY2F0b3ItdXRpbHMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvdHJhY2VyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL3Jhc3Rlcml6ZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3Ivc2tlbGV0b25pemVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvYmFyY29kZS1sb2NhdG9yLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJnbG9iYWwiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xOV9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMjBfXyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJvYmoiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJsZW5ndGgiLCJkZXNjcmlwdG9yIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpbnN0YW5jZSIsIlR5cGVFcnJvciIsIl9nZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiZ2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwic2VsZiIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNvbnN0cnVjdG9yIiwiUmVmZXJlbmNlRXJyb3IiLCJzdXBlclByb3BCYXNlIiwiX2dldCIsInJlY2VpdmVyIiwiUmVmbGVjdCIsImJhc2UiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX3R5cGVvZjIiLCJpdGVyYXRvciIsImFycmF5V2l0aG91dEhvbGVzIiwiaXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVTcHJlYWQiLCJhcnIiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJyZXNvbHZlIiwicmVqZWN0IiwiX25leHQiLCJfdGhyb3ciLCJhcmciLCJpbmZvIiwiZXJyb3IiLCJkb25lIiwiUHJvbWlzZSIsInRoZW4iLCJmbiIsInRoaXMiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlcnIiLCJ1bmRlZmluZWQiLCJBcnJheSIsImlzQXJyYXkiLCJhcnIyIiwiaXRlciIsInRvU3RyaW5nIiwiZnJvbSIsIl9zZXRQcm90b3R5cGVPZiIsImciLCJGdW5jdGlvbiIsImhhZFJ1bnRpbWUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaW5kZXhPZiIsIm9sZFJ1bnRpbWUiLCJlIiwiT3AiLCJoYXNPd24iLCIkU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwiaW5Nb2R1bGUiLCJydW50aW1lIiwid3JhcCIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiR2VuZXJhdG9yIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibWFyayIsImF3cmFwIiwiX19hd2FpdCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsIkFzeW5jSXRlcmF0b3IiLCJhc3luYyIsImlubmVyRm4iLCJvdXRlckZuIiwidHJ5TG9jc0xpc3QiLCJuZXh0IiwicmVzdWx0Iiwia2V5cyIsInB1c2giLCJyZXZlcnNlIiwicG9wIiwiQ29udGV4dCIsInJlc2V0Iiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJzZW50IiwiX3NlbnQiLCJkZWxlZ2F0ZSIsIm1ldGhvZCIsInRyeUVudHJpZXMiLCJmb3JFYWNoIiwicmVzZXRUcnlFbnRyeSIsImNoYXJBdCIsImlzTmFOIiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsImNvbXBsZXRpb24iLCJ0eXBlIiwicnZhbCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiZXhjZXB0aW9uIiwiY29udGV4dCIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsInJlY29yZCIsImVudHJ5IiwidHJ5TG9jIiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiRXJyb3IiLCJhYnJ1cHQiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImFmdGVyTG9jIiwiZmluaXNoIiwiY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiaXRlcmFibGUiLCJyZXN1bHROYW1lIiwibmV4dExvYyIsInByb3RvR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiX2ludm9rZSIsInN0YXRlIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInRyeUNhdGNoIiwibWFrZUludm9rZU1ldGhvZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiaW52b2tlIiwidW53cmFwcGVkIiwicmV0dXJuIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsIml0ZXJhdG9yTWV0aG9kIiwiSW1hZ2VEZWJ1ZyIsImRyYXdQYXRoIiwicGF0aCIsImNvbG9yIiwibGluZVdpZHRoIiwic3Ryb2tlU3R5bGUiLCJmaWxsU3R5bGUiLCJiZWdpblBhdGgiLCJtb3ZlVG8iLCJ4IiwieSIsIl9yZWYiLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJkcmF3SW1hZ2UiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImhlaWdodCIsImNhbnZhc0RhdGEiLCJnZXRJbWFnZURhdGEiLCJkYXRhIiwiaW1hZ2VJbmRleCIsImNhbnZhc0luZGV4IiwicHV0SW1hZ2VEYXRhIiwiUmVzdWx0Q29sbGVjdG9yIiwiY29uZmlnIiwiY2xhc3NDYWxsQ2hlY2tfZGVmYXVsdCIsImRlZmluZVByb3BlcnR5X2RlZmF1bHQiLCJfcmVzdWx0cyIsIl9jb25maWciLCJfY2FwYWNpdHkiLCJjYXBhY2l0eSIsIl9jYXB0dXJlIiwiY2FwdHVyZSIsIl9jYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJfY29udGV4dCIsImdldENvbnRleHQiLCJjcmVhdGVDbGFzc19kZWZhdWx0IiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0IiwiY29kZVJlc3VsdCIsIl9jb250YWlucyIsIl9wYXNzZXNGaWx0ZXIiLCJmcmFtZSIsInRvRGF0YVVSTCIsImJsYWNrbGlzdCIsInNvbWUiLCJpdGVtIiwiZXZlcnkiLCJmaWx0ZXIiLCJldmVudHMiLCJFdmVudHMiLCJldmVudCIsImNhbGxiYWNrIiwic3Vic2NyaXB0aW9uIiwiZ2V0RXZlbnQiLCJzdWJzY3JpcHRpb25zIiwiZXZlbnRJdGVtIiwib25jZSIsInB1Ymxpc2hTdWJzY3JpcHRpb24iLCJfcmVmMiIsInN1YnNjcmliZSIsImV2ZW50TmFtZSIsInNldFRpbWVvdXQiLCJoc3YycmdiIiwiaHN2IiwicmdiIiwiaCIsInYiLCJNYXRoIiwiYWJzIiwiYiIsIkltYWdlV3JhcHBlciIsInNpemUiLCJhcnJheVR5cGUiLCJpbml0aWFsaXplIiwiVWludDhBcnJheSIsImZpbGwiLCJwb2ludCIsImJvcmRlciIsImltYWdlV3JhcHBlciIsImZyb21YIiwiZnJvbVkiLCJzaXplWSIsInNpemVYIiwibGFiZWxDb3VudCIsImxhYmVsU3VtIiwibTAwIiwibTAxIiwibTEwIiwibTExIiwibTAyIiwibTIwIiwidGhldGEiLCJyYWQiLCJ5c3EiLCJ2YWwiLCJsYWJlbCIsIlBJIiwiUElfNCIsInhfIiwieV8iLCJtdTExIiwibXUwMiIsIm11MjAiLCJ0bXAiLCJhdGFuIiwiY29zIiwic2luIiwic2NhbGUiLCJjdXJyZW50IiwicGl4ZWwiLCJ3aGl0ZVJnYiIsImJsYWNrUmdiIiwibWVyZ2UiLCJpc09iamVjdCIsInR5cGVvZl9kZWZhdWx0IiwiX2xlbiIsIm9iamVjdHMiLCJfa2V5IiwicmVkdWNlIiwicFZhbCIsIm9WYWwiLCJCYXJjb2RlRGlyZWN0aW9uIiwiaW5wdXRTdHJlYW0iLCJzZXF1ZW5jZSIsImFyZWEiLCJ0b3AiLCJyaWdodCIsImxlZnQiLCJib3R0b20iLCJzaW5nbGVDaGFubmVsIiwibG9jYXRlIiwibnVtT2ZXb3JrZXJzIiwiZGVjb2RlciIsInJlYWRlcnMiLCJsb2NhdG9yIiwiaGFsZlNhbXBsZSIsInBhdGNoU2l6ZSIsIkJhcmNvZGVSZWFkZXIiLCJzdXBwbGVtZW50cyIsIl9mb3JtYXQiLCJfcm93IiwiX3NpbmdsZUNvZGVFcnJvciIsIl9hdmVyYWdlQ29kZUVycm9yIiwiU3RhcnROb3RGb3VuZEV4Y2VwdGlvbiIsIkNvZGVOb3RGb3VuZEV4Y2VwdGlvbiIsIlBhdHRlcm5Ob3RGb3VuZEV4Y2VwdGlvbiIsInBhdHRlcm4iLCJvZmZzZXQiLCJpc1doaXRlIiwidHJ5SGFyZGVyIiwiY291bnRlciIsImJlc3RNYXRjaCIsIk51bWJlciIsIk1BWF9WQUxVRSIsImNvZGUiLCJzdGFydCIsImVuZCIsImVwc2lsb24iLCJBVkVSQUdFX0NPREVfRVJST1IiLCJjb3VudGVyUG9zIiwiX25leHRTZXQiLCJfbWF0Y2hQYXR0ZXJuIiwic3VtIiwiaiIsImxpbmUiLCJtYXhTaW5nbGVFcnJvciIsIm1vZHVsbyIsIlNJTkdMRV9DT0RFX0VSUk9SIiwiYmFyV2lkdGgiLCJjb3VudCIsInNjYWxlZCIsInNpbmdsZUVycm9yIiwiY29ycmVjdGlvbiIsImluZGljZXMiLCJkZWNvZGUiLCJkaXJlY3Rpb24iLCJSZXZlcnNlIiwiRm9yd2FyZCIsImZvcm1hdCIsIkZPUk1BVCIsImNvdW50ZXJzIiwibnVtQ291bnRlcnMiLCJDT0RFX1BBVFRFUk4iLCJNT0RVTEVfSU5ESUNFUyIsIkNvZGUxMjhSZWFkZXIiLCJfQmFyY29kZVJlYWRlciIsIl90aGlzIiwicG9zc2libGVDb25zdHJ1Y3RvclJldHVybl9kZWZhdWx0IiwiZ2V0UHJvdG90eXBlT2ZfZGVmYXVsdCIsImluaGVyaXRzX2RlZmF1bHQiLCJiYXIiLCJzcGFjZSIsIl9jb3JyZWN0IiwiZXhwZWN0ZWQiLCJfY2FsY3VsYXRlQ29ycmVjdGlvbiIsIl9jb3JyZWN0QmFycyIsImNvZGVzZXQiLCJ1bnNoaWZ0Iiwic3RhcnRJbmZvIiwiX2ZpbmRTdGFydCIsIm11bHRpcGxpZXIiLCJjaGVja3N1bSIsInJhd1Jlc3VsdCIsImRlY29kZWRDb2RlcyIsInNoaWZ0TmV4dCIsInJlbW92ZUxhc3RDaGFyYWN0ZXIiLCJfZGVjb2RlQ29kZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIl9uZXh0VW5zZXQiLCJfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlIiwic3BsaWNlIiwiam9pbiIsImVuZEluZm8iLCJ0cmFpbGluZ1doaXRlc3BhY2VFbmQiLCJfbWF0Y2hSYW5nZSIsIm5vcm1hbGl6ZWQiLCJzdW1Ob3JtYWxpemVkIiwic3VtRXhwZWN0ZWQiLCJBTFBIQUJFVCIsIlVpbnQxNkFycmF5IiwidG9Db25zdW1hYmxlQXJyYXlfZGVmYXVsdCIsIm1hcCIsImNoYXIiLCJjaGFyQ29kZUF0IiwiQ0hBUkFDVEVSX0VOQ09ESU5HUyIsIkNvZGUzOVJlYWRlciIsImRlY29kZWRDaGFyIiwibGFzdFN0YXJ0IiwibmV4dFN0YXJ0IiwiX3RvQ291bnRlcnMiLCJfdG9QYXR0ZXJuIiwiX3BhdHRlcm5Ub0NoYXIiLCJwYXR0ZXJuU2l6ZSIsIm1pbldpZHRoIiwibWF4TmFycm93V2lkdGgiLCJudW1XaWRlQmFycyIsIndpZGVCYXJXaWR0aCIsIl9maW5kTmV4dFdpZHRoIiwid2hpdGVTcGFjZU11c3RTdGFydCIsInBhdHRlcm5TdGFydCIsIm1heCIsIkNvZGUzOVZJTlJlYWRlciIsIl9Db2RlMzlSZWFkZXIiLCJnZXRfZGVmYXVsdCIsInJlcGxhY2UiLCJ0ZXN0IiwiX2NoZWNrQ2hlY2tzdW0iLCJTVEFSVF9FTkQiLCJDb2RhYmFyUmVhZGVyIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkX2RlZmF1bHQiLCJfY291bnRlcnMiLCJfZmlsbENvdW50ZXJzIiwic3RhcnRDb3VudGVyIiwiX3ZlcmlmeVdoaXRlc3BhY2UiLCJfdmFsaWRhdGVSZXN1bHQiLCJfc3VtQ291bnRlcnMiLCJlbmRDb3VudGVyIiwiX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgiLCJjYXRlZ29yaXphdGlvbiIsIm5hcnJvdyIsImNvdW50cyIsIm1pbiIsIndpZGUiLCJwb3MiLCJfY2hhclRvUGF0dGVybiIsImtpbmQiLCJjYXQiLCJmbG9vciIsImNlaWwiLCJjaGFyQ29kZSIsInRocmVzaG9sZCIsIl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuIiwiYmFyVGhyZXNob2xkIiwiX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZCIsInNwYWNlVGhyZXNob2xkIiwiYml0bWFzayIsIl90aGlzMiIsIl9sb29wIiwiX3JldCIsIlNsb3BlIiwiRVhURU5TSU9OX1NUQVJUX1BBVFRFUk4iLCJDT0RFX0ZSRVFVRU5DWSIsIkVBTlJlYWRlciIsImNvZGVyYW5nZSIsIl9maW5kUGF0dGVybiIsIlNUQVJUX1BBVFRFUk4iLCJsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0IiwiU1RPUF9QQVRURVJOIiwiY29kZUZyZXF1ZW5jeSIsIkNPREVfR19TVEFSVCIsImZpcnN0RGlnaXQiLCJfY2FsY3VsYXRlRmlyc3REaWdpdCIsIk1JRERMRV9QQVRURVJOIiwicmVzdWx0SW5mbyIsIl9kZWNvZGVQYXlsb2FkIiwiX2ZpbmRFbmQiLCJfY2hlY2tzdW0iLCJzdXBwbGVtZW50IiwiX2RlY29kZUV4dGVuc2lvbnMiLCJsYXN0Q29kZSIsIl9vYmplY3RTcHJlYWQiLCJFQU44UmVhZGVyIiwiX0VBTlJlYWRlciIsIkVBTjJSZWFkZXIiLCJyb3ciLCJwYXJzZUludCIsIkVBTjVSZWFkZXIiLCJfZXh0ZW5zaW9uQ2hlY2tzdW0iLCJfZGV0ZXJtaW5lQ2hlY2tEaWdpdCIsIkNIRUNLX0RJR0lUX0VOQ09ESU5HUyIsIlVQQ1JlYWRlciIsInN1YnN0cmluZyIsIlVQQ0VSZWFkZXIiLCJfZGV0ZXJtaW5lUGFyaXR5IiwibnJTeXN0ZW0iLCJsYXN0RGlnaXQiLCJ1cGNhIiwiY29uY2F0IiwiX2NvbnZlcnRUb1VQQ0EiLCJJMm9mNVJlYWRlciIsIm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgiLCJfYmFyU3BhY2VSYXRpbyIsImNvdW50ZXJTdW0iLCJjb2RlU3VtIiwibmFycm93QmFyV2lkdGgiLCJjb2RlMCIsImNvZGUxIiwiY291bnRlckxlbmd0aCIsImNvdW50ZXIwIiwiY291bnRlcjEiLCJzdGFydFBhdHRlcm5MZW5ndGgiLCJUd29PZkZpdmVSZWFkZXIiLCJSZWFkZXJzIiwiY29kZV8xMjhfcmVhZGVyIiwiZWFuX3JlYWRlciIsImVhbl81X3JlYWRlciIsImVhbl8yX3JlYWRlciIsImVhbl84X3JlYWRlciIsImNvZGVfMzlfcmVhZGVyIiwiY29kZV8zOV92aW5fcmVhZGVyIiwiY29kYWJhcl9yZWFkZXIiLCJ1cGNfcmVhZGVyIiwidXBjX2VfcmVhZGVyIiwiaTJvZjVfcmVhZGVyIiwiMm9mNV9yZWFkZXIiLCJjb2RlXzkzX3JlYWRlciIsIkNvZGU5M1JlYWRlciIsIl92ZXJpZnlFbmQiLCJfdmVyaWZ5Q2hlY2tzdW1zIiwiX2RlY29kZUV4dGVuZGVkIiwicm91bmQiLCJjaGFyQXJyYXkiLCJuZXh0Q2hhciIsIm5leHRDaGFyQ29kZSIsIl9tYXRjaENoZWNrQ2hhciIsImluZGV4IiwibWF4V2VpZ2h0IiwiYXJyYXlUb0NoZWNrIiwid2VpZ2h0ZWRTdW1zIiwiX3N0cmVhbSIsIkJyZXNlbmhhbSIsInAxIiwicDIiLCJ4MCIsInkwIiwieDEiLCJ5MSIsInN0ZWVwIiwicmVhZCIsImEiLCJkZWx0YXgiLCJkZWx0YXkiLCJ5c3RlcCIsImNlbnRlciIsImV4dHJlbWEiLCJyVGhyZXNob2xkIiwiY3VycmVudERpciIsIlVwIiwiRG93biIsInNsb3BlIiwic2xvcGUyIiwiZGlyIiwiYnJlc2VuaGFtX29iamVjdFNwcmVhZCIsIkJhcmNvZGVEZWNvZGVyIiwiaW5wdXRJbWFnZVdyYXBwZXIiLCJfaW5wdXRJbWFnZVdyYXBwZXIiLCJfYmFyY29kZVJlYWRlcnMiLCJfaW5pdFJlYWRlcnMiLCJib3hlcyIsImJhcmNvZGUiLCJtdWx0aXBsZSIsImJhcmNvZGVzIiwiYm94IiwiZGVjb2RlRnJvbUJvdW5kaW5nQm94IiwiX2dldExpbmUiLCJhbmdsZSIsImF0YW4yIiwiX2dldEV4dGVuZGVkTGluZSIsIl90cnlEZWNvZGUiLCJfdHJ5RGVjb2RlQnJ1dGVGb3JjZSIsImJhcmNvZGVMaW5lIiwicmVhZGVyQ29uZmlnIiwicmVhZGVyIiwiY29uZmlndXJhdGlvbiIsImV4dGVuZExpbmUiLCJhbW91bnQiLCJleHRlbnNpb24iLCJleHRlbnNpb25MZW5ndGgiLCJzcXJ0IiwicG93IiwiaW5JbWFnZVdpdGhCb3JkZXIiLCJkZWNvZGVQYXR0ZXJuIiwibGluZUFuZ2xlIiwic2lkZUxlbmd0aCIsInhkaXIiLCJ5ZGlyIiwiX2ZyZXF1ZW5jeUNhbnZhcyIsIl9wYXR0ZXJuQ2FudmFzIiwiZmlsbFJlY3QiLCJfb3ZlcmxheUNvbnRleHQiLCJfZW51bWVyYXRlVmlkZW9EZXZpY2VzIiwiX3JlcXVlc3QiLCJDYW1lcmFBY2Nlc3MiLCJyZXF1ZXN0IiwiYXN5bmNUb0dlbmVyYXRvcl9kZWZhdWx0IiwicmVnZW5lcmF0b3JfZGVmYXVsdCIsIl9jYWxsZWUiLCJ2aWRlbyIsInZpZGVvQ29uc3RyYWludHMiLCJub3JtYWxpemVkQ29uc3RyYWludHMiLCJwaWNrQ29uc3RyYWludHMiLCJjb25zdHJhaW50cyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldFVzZXJNZWRpYSIsInNyY09iamVjdCIsInNldEF0dHJpYnV0ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwbGF5IiwiX3dhaXRGb3JWaWRlbyIsIl94IiwiX3gyIiwicmVsZWFzZSIsInRyYWNrcyIsImdldFZpZGVvVHJhY2tzIiwiZW51bWVyYXRlVmlkZW9EZXZpY2VzIiwiX2NhbGxlZTIiLCJkZXZpY2VzIiwiX2NvbnRleHQyIiwiZW51bWVyYXRlRGV2aWNlcyIsImdldEFjdGl2ZVN0cmVhbUxhYmVsIiwidHJhY2siLCJnZXRBY3RpdmVUcmFjayIsImZhY2luZ01vZGUiLCJhc3BlY3RSYXRpbyIsImRldmljZUlkIiwibWluQXNwZWN0UmF0aW8iLCJmYWNpbmciLCJjb25zb2xlIiwibG9nIiwiYXVkaW8iLCJfcmVmMyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImF0dGVtcHRzIiwiY2hlY2tWaWRlbyIsIndpbmRvdyIsIm5kYXJyYXkiLCJGcmFtZUdyYWJiZXIiLCJfaW5wdXRTdHJlYW0iLCJfc3RyZWFtQ29uZmlnIiwiX3ZpZGVvSGVpZ2h0IiwicmVhbEhlaWdodCIsIl92aWRlb1dpZHRoIiwicmVhbFdpZHRoIiwiX2NhbnZhc0hlaWdodCIsImNhbnZhc0hlaWdodCIsIl9jYW52YXNXaWR0aCIsImNhbnZhc1dpZHRoIiwiX3dpZHRoIiwiX2hlaWdodCIsIl90b3BMZWZ0IiwidG9wTGVmdCIsIl9kYXRhIiwiX2dyYXlEYXRhIiwiX2NhbnZhc0RhdGEiLCJfZ3JheUltYWdlQXJyYXkiLCJ0cmFuc3Bvc2UiLCJfY2FudmFzSW1hZ2VBcnJheSIsIl90YXJnZXRJbWFnZUFycmF5IiwiaGkiLCJsbyIsIl9zdGVwU2l6ZVgiLCJfc3RlcFNpemVZIiwiSlNPTiIsInN0cmluZ2lmeSIsInZpZGVvU2l6ZSIsInNoYXBlIiwiY2FudmFzU2l6ZSIsInN0ZXBTaXplIiwiZ2V0RnJhbWUiLCJfc2NhbGVBbmRDcm9wIiwiX2NvbXB1dGVHcmF5Iiwic2V0IiwiaW50ZXJwMmQiLCJpbWFnZURhdGFMZW5ndGgiLCJpeCIsImZ4IiwiczAiLCJzMSIsIml5IiwiZnkiLCJ0MCIsInQxIiwidzAwIiwidzAxIiwiSW5wdXRTdHJlYW0iLCJfZXZlbnROYW1lcyIsIl9ldmVudEhhbmRsZXJzIiwiTWFwIiwibGlzdGVuZXIiLCJfb3B0aW9ucyIsImhhcyIsImNsZWFyIiwiYXJnQXJyYXkiLCJoYW5kbGVycyIsImhhbmRsZXIiLCJfY2FsY3VsYXRlZEhlaWdodCIsIl9jYWxjdWxhdGVkV2lkdGgiLCJpbnB1dF9zdHJlYW1fb2JqZWN0U3ByZWFkIiwiZ2V0UGl4ZWxzIiwiSW1hZ2VTdHJlYW0iLCJfSW5wdXRTdHJlYW0iLCJfYmFzZVVybCIsIl9lbmRlZCIsIl9mcmFtZSIsIl9sb2FkZWQiLCJfb2Zmc2V0IiwiX3NpemUiLCJtaW1lIiwicGl4ZWxzIiwicHJvY2VzcyIsImV4aXQiLCJ0cmlnZ2VyIiwiaW1hZ2Vfc3RyZWFtX25vZGVfb2JqZWN0U3ByZWFkIiwic3JjIiwiX2xvYWRJbWFnZXMiLCJfdGltZSIsIlZpZGVvU3RyZWFtIiwiX3ZpZGVvIiwicGF1c2UiLCJvcHRpb25zIiwiX2luaXRTaXplIiwidmlkZW9fc3RyZWFtX29iamVjdFNwcmVhZCIsImVuZGVkIiwidGltZSIsImN1cnJlbnRUaW1lIiwiTGl2ZVN0cmVhbSIsIl9WaWRlb1N0cmVhbSIsIl9jb21wdXRlRGl2aXNvcnMiLCJkaXZpc29ycyIsImxhcmdlRGl2aXNvcnMiLCJkaXZpc29yIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwid2lkZVNpZGUiLCJuck9mUGF0Y2hlc0xpc3QiLCJuck9mUGF0Y2hlc01hcCIsIngtc21hbGwiLCJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieC1sYXJnZSIsIm5yT2ZQYXRjaGVzSW5kZXgiLCJuck9mUGF0Y2hlcyIsImRlc2lyZWRQYXRjaFNpemUiLCJmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMiLCJmb3VuZCIsImxhcmdlRGl2aXNvciIsIl9jb21wdXRlQ29tbW9uRGl2aXNvcnMiLCJjaGVja0ltYWdlQ29uc3RyYWludHMiLCJzaGlmdCIsImlucHV0U3RyZWFtQ29uZmlnIiwiaW5wdXRXaWR0aCIsImlucHV0SGVpZ2h0IiwicGFyc2VkQXJlYSIsInBhcnNlZCIsInBhcnNlRmxvYXQiLCJ1bml0IiwiX3BhcnNlQ3NzRGltZW5zaW9uVmFsdWVzIiwiY2FsY3VsYXRlZCIsIl9kaW1lbnNpb25zQ29udmVydGVycyIsImNvbXB1dGVJbWFnZUFyZWEiLCJzZXRDYW52YXNTaXplIiwiZGltZW5zaW9uIiwiX3JlZjQiLCJfcmVmNSIsIkNsdXN0ZXIiLCJtb21lbnQiLCJfdGhyZXNob2xkIiwiX21vbWVudHMiLCJfY2VudGVyIiwiYWRkIiwibW9tZW50cyIsImNsdXN0ZXJzIiwibWF0Y2hpbmdDbHVzdGVyIiwiZmluZCIsImNsdXN0ZXIiLCJmaXRzIiwidHJhbnNmb3JtV2l0aE1hdHJpeCIsIm1hdHJpeCIsIl9kZXRlcm1pbmVPdHN1VGhyZXNob2xkIiwiYml0c1BlclBpeGVsIiwiYml0U2hpZnQiLCJoaXN0IiwiaGlzdG9ncmFtIiwiSW50MzJBcnJheSIsIl9jb21wdXRlSGlzdG9ncmFtIiwidmV0IiwicHgiLCJpbml0IiwibXgiLCJrIiwicDEyIiwibTEyIiwibWF4SW5kZXgiLCJhcnJheSIsIkVkZ2VMYWJlbCIsIkNvbnRvdXJEaXJlY3Rpb24iLCJTZWFyY2hEaXJlY3Rpb25zIiwiVHJhY2VyIiwibGFiZWxXcmFwcGVyIiwiX2ltYWdlRGF0YSIsIl9sYWJlbERhdGEiLCJlZGdlTGFiZWwiLCJjeSIsImN4Iiwic3kiLCJzeCIsIkZ2IiwidHJhY2UiLCJDdiIsImxkaXIiLCJQIiwiUmFzdGVyaXplciIsIl90cmFjZXIiLCJkZXB0aExhYmVsIiwiY29sb3JNYXAiLCJzYyIsImNjIiwiY29ubmVjdGVkQ291bnQiLCJsYWJlbEluZGV4IiwiYmMiLCJsYyIsInZlcnRleCIsImNvbnRvdXJUcmFjaW5nIiwiT3V0c2lkZSIsIkNXIiwiZmlyc3RWZXJ0ZXgiLCJuZXh0UGVlciIsImluc2lkZUNvbnRvdXJzIiwicHJldmlvdXNQZWVyIiwiSW5zaWRlIiwiQ0NXIiwiY2FudmFzIiwiZmlyc3RDb250b3VyIiwicHEiLCJpcSIsInEiLCJVbmtub3duIiwiU2tlbGV0b25pemVyIiwiX2ZyYW1lR3JhYmJlciIsIl9zdG9wcGVkIiwiX2xvY2F0b3IiLCJfYm94U2l6ZSIsIl9kZWNvZGVyIiwiX29uVUlUaHJlYWQiLCJfcmVzdWx0Q29sbGVjdG9yIiwic3RkbGliIiwiZm9yZWlnbiIsImJ1ZmZlciIsImltYWdlcyIsImltdWwiLCJlcm9kZSIsImluSW1hZ2VQdHIiLCJvdXRJbWFnZVB0ciIsInUiLCJ5U3RhcnQxIiwieVN0YXJ0MiIsInhTdGFydDEiLCJ4U3RhcnQyIiwic3VidHJhY3QiLCJhSW1hZ2VQdHIiLCJiSW1hZ2VQdHIiLCJiaXR3aXNlT3IiLCJjb3VudE5vblplcm8iLCJpbWFnZVB0ciIsImRpbGF0ZSIsIm1lbWNweSIsInNyY0ltYWdlUHRyIiwiZHN0SW1hZ2VQdHIiLCJ6ZXJvQm9yZGVyIiwic2tlbGV0b25pemUiLCJzdWJJbWFnZVB0ciIsImVyb2RlZEltYWdlUHRyIiwidGVtcEltYWdlUHRyIiwic2tlbEltYWdlUHRyIiwiQmFyY29kZUxvY2F0b3IiLCJfbnVtUGF0Y2hlcyIsIl9pbml0QnVmZmVycyIsIl9pbml0Q2FudmFzIiwib3V0SW1hZ2VXcmFwcGVyIiwiaW1hZ2UiLCJvdXRJbWFnZSIsImVuZEluZGV4Iiwib3V0V2lkdGgiLCJ0b3BSb3dJbmRleCIsImJvdHRvbVJvd0luZGV4Iiwib3V0SW1nSW5kZXgiLCJfY3VycmVudEltYWdlV3JhcHBlciIsIl9iaW5hcml6ZUltYWdlIiwicGF0Y2hlc0ZvdW5kIiwiX2ZpbmRQYXRjaGVzIiwibWF4TGFiZWwiLCJfcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkiLCJ0b3BMYWJlbHMiLCJfZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyIsIl9maW5kQm94ZXMiLCJfcGF0Y2hTaXplIiwiX2JpbmFyeUltYWdlV3JhcHBlciIsIl9sYWJlbEltYWdlV3JhcHBlciIsInNrZWxldG9uSW1hZ2VEYXRhIiwiQXJyYXlCdWZmZXIiLCJfc3ViSW1hZ2VXcmFwcGVyIiwiX3NrZWxJbWFnZVdyYXBwZXIiLCJfc2tlbGV0b25pemVyIiwic2tlbGV0b25pemVyIiwiX3BhdGNoTGFiZWxHcmlkIiwiX3BhdGNoR3JpZCIsIl9pbWFnZVRvUGF0Y2hHcmlkIiwidXNlV29ya2VyIiwiY2xhc3NOYW1lIiwiX2JpbmFyeUNvbnRleHQiLCJwYXRjaGVzIiwiYXZlcmFnZVJhZCIsIkZsb2F0MzJBcnJheSIsImludmVyc2VNYXRyaXgiLCJhMCIsImExIiwiYTIiLCJhMyIsImRldGVybWluYW50IiwiaW52ZXJ0IiwibWluWCIsIm1pblkiLCJtYXhYIiwibWF4WSIsInRhcmdldFdyYXBwZXIiLCJ0YXJnZXREYXRhIiwiX3NrZWxldG9uaXplIiwicmFzdGVyUmVzdWx0IiwicmFzdGVyaXplIiwicGF0Y2giLCJfZGVzY3JpYmVQYXRjaCIsImxhYmVsSGlzdCIsIl9yZWY2Iiwic29ydCIsIl9yZWY3IiwiX2JveEZyb21QYXRjaGVzIiwiY2x1c3Rlcml6ZSIsInN1YkltYWdlQXNDb3B5IiwibWluQ29tcG9uZW50V2VpZ2h0IiwiZWxpZ2libGVNb21lbnRzIiwibWF0Y2hpbmdNb21lbnRzIiwiX3NpbWlsYXJNb21lbnRzIiwiY3VycmVudEluZGV4IiwiX3RoaXMzIiwiY3VycmVudFBhdGNoIiwiX3RyYWNlIiwiX3RoaXM0IiwiX25vdFlldFByb2Nlc3NlZCIsIl9yZWY5Iiwic3Ryb2tlUmVjdCIsIl9jYW52YXNDb250YWluZXIiLCJjdHgiLCJvdmVybGF5IiwiZG9tIiwiX3dvcmtlclBvb2wiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiY2IiLCJkZWZhdWx0Q29uZmlnIiwiX2luaXRpYWxpemVEYXRhIiwidmlld3BvcnQiLCJfZ2V0Vmlld1BvcnQiLCJxdWVyeVNlbGVjdG9yIiwiYXBwZW5kQ2hpbGQiLCJjbGVhckZpeCIsIl9hZGp1c3RXb3JrZXJQb29sIiwiX2luaXRJbnB1dFN0cmVhbSIsImRlbGF5IiwiZnJlcXVlbmN5IiwidGltZXN0YW1wIiwiX3VwZGF0ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInBlcmZvcm1hbmNlIiwibm93IiwiY2xlYXJFdmVudEhhbmRsZXJzIiwiZGVjb2RlU2luZ2xlIiwicmVzdWx0Q2FsbGJhY2siLCJvbkRldGVjdGVkIiwib2ZmRGV0ZWN0ZWQiLCJ1bnN1YnNjcmliZSIsIm9uUHJvY2Vzc2VkIiwib2ZmUHJvY2Vzc2VkIiwic2V0UmVhZGVycyIsIndvcmtlciIsInBvc3RNZXNzYWdlIiwiY21kIiwicmVnaXN0ZXJSZXN1bHRDb2xsZWN0b3IiLCJyZXN1bHRDb2xsZWN0b3IiLCJhZGRSZXN1bHQiLCJIVE1MRWxlbWVudCIsInNlbGVjdG9yIiwiX3RyYW5zZm9ybSIsInBvbHlnb24iLCJfcHVibGlzaFJlc3VsdCIsInJlc3VsdFRvUHVibGlzaCIsIl90cmFuc2Zvcm1SZXN1bHQiLCJfYWRkUmVzdWx0IiwicHVibGlzaCIsIl9oYXNDb2RlUmVzdWx0IiwiX2xvY2F0ZUFuZERlY29kZSIsImRlY29kZUZyb21Cb3VuZGluZ0JveGVzIiwiYXZhaWxhYmxlV29ya2VyIiwiYnVzeSIsImdyYWIiLCJfaW5pdFdvcmtlciIsImZhY3RvcnlTb3VyY2UiLCJibG9iIiwiYmxvYlVSTCIsIl9fZmFjdG9yeVNvdXJjZV9fIiwiQmxvYiIsIl93b3JrZXJJbnRlcmZhY2UiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJ3b3JrZXJUaHJlYWQiLCJXb3JrZXIiLCJvbm1lc3NhZ2UiLCJyZXZva2VPYmplY3RVUkwiLCJRdWFnZ2EiLCJtZXNzYWdlIiwiaW5jcmVhc2VCeSIsInRlcm1pbmF0ZSJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBQUEsRUFBQUMsR0FDQSxpQkFBQUMsU0FBQSxpQkFBQUMsT0FDQUEsT0FBQUQs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LEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNoQixDQUFDLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLElBRWpCQyxFQUF3QixDQUFDLEVBQUcsRUFBRyxHQUEvQkEsRUFBMEMsQ0FBQyxFQUFHLEVBQUcsR0FFMUNDLEVBQWIsU0FBQUMsR0FDSSxTQUFBRCxJQUFjLElBQUFFLEVBQUEsT0FBQXBLLElBQUF2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b2RlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibmRhcnJheVwiKSwgcmVxdWlyZShcImdldC1waXhlbHNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJRdWFnZ2FcIiwgW1wibmRhcnJheVwiLCBcImdldC1waXhlbHNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUXVhZ2dhXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibmRhcnJheVwiKSwgcmVxdWlyZShcImdldC1waXhlbHNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlF1YWdnYVwiXSA9IGZhY3Rvcnkocm9vdFtcIm5kYXJyYXlcIl0sIHJvb3RbXCJnZXQtcGl4ZWxzXCJdKTtcbn0pKGdsb2JhbCwgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTlfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMjBfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjEpO1xuIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgYXNzZXJ0VGhpc0luaXRpYWxpemVkID0gcmVxdWlyZShcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIHN1cGVyUHJvcEJhc2UgPSByZXF1aXJlKFwiLi9zdXBlclByb3BCYXNlXCIpO1xuXG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LmdldCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IFJlZmxlY3QuZ2V0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDsiLCJmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZjIob2JqKTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJ2YXIgYXJyYXlXaXRob3V0SG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhvdXRIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWRcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdG9Db25zdW1hYmxlQXJyYXk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkOyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mOyIsInZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QsIHByb3BlcnR5KSB7XG4gIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3N1cGVyUHJvcEJhc2U7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbn0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMgfHwgKHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiICYmIHNlbGYpO1xuICB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTlfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzIwX187IiwiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuL3BvaW50JztcblxuZXhwb3J0IGNvbnN0IEltYWdlRGVidWcgPSB7XG4gICAgZHJhd1BhdGgocGF0aDogQXJyYXk8UG9pbnQ+LCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yOiBzdHJpbmcsIGxpbmVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHBhdGhbMF0ueCwgcGF0aFswXS55KTtcbiAgICAgICAgICAgIHBhdGguc2xpY2UoMSkuZm9yRWFjaCgoeyB4LCB5IH0pID0+IGNvbnRleHQubGluZVRvKHgsIHkpKTtcbiAgICAgICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRyYXdJbWFnZShpbWFnZURhdGE6IFVpbnQ4QXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY2FudmFzRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCBkYXRhID0gY2FudmFzRGF0YS5kYXRhO1xuICAgICAgICBsZXQgaW1hZ2VJbmRleCA9IGltYWdlRGF0YS5sZW5ndGggfCAwO1xuICAgICAgICBsZXQgY2FudmFzSW5kZXggPSBkYXRhLmxlbmd0aCB8IDA7XG5cbiAgICAgICAgaWYgKGNhbnZhc0luZGV4IC8gaW1hZ2VJbmRleCAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGltYWdlSW5kZXgtLSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbWFnZURhdGFbaW1hZ2VJbmRleF07XG4gICAgICAgICAgICBkYXRhWy0tY2FudmFzSW5kZXhdID0gMjU1O1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5wdXRJbWFnZURhdGEoY2FudmFzRGF0YSwgMCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW1hZ2VEZWJ1ZyB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS1kZWJ1Zyc7XG5pbXBvcnQgeyBRdWFnZ2FCYXJjb2RlIH0gZnJvbSAnLi4vZGVjb2Rlci9iYXJjb2RlLWRlY29kZXInO1xuaW1wb3J0IHsgQmFyY29kZSB9IGZyb20gJy4uL3JlYWRlci9iYXJjb2RlLXJlYWRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0Q29sbGVjdG9yQ29uZmlnIHtcbiAgICBjYXBhY2l0eT86IG51bWJlcjtcbiAgICBjYXB0dXJlPzogYm9vbGVhbjtcbiAgICBibGFja2xpc3Q/OiBBcnJheTxCYXJjb2RlPjtcbiAgICBmaWx0ZXI/OiAoaXRlbTogQmFyY29kZSkgPT4gYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3VsdENvbGxlY3RvciB7XG4gICAgcHJpdmF0ZSBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBwcml2YXRlIF9jb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgcHJpdmF0ZSBfY29uZmlnOiBSZXN1bHRDb2xsZWN0b3JDb25maWc7XG4gICAgcHJpdmF0ZSBfY2FwYWNpdHk6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jYXB0dXJlOiBib29sZWFuO1xuICAgIHByaXZhdGUgX3Jlc3VsdHM6IEFycmF5PFF1YWdnYUJhcmNvZGU+O1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBSZXN1bHRDb2xsZWN0b3JDb25maWcpIHtcbiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IG5ldyBBcnJheTxRdWFnZ2FCYXJjb2RlPigpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY29uZmlnLmNhcGFjaXR5IHx8IDIwO1xuICAgICAgICB0aGlzLl9jYXB0dXJlID0gY29uZmlnLmNhcHR1cmUgPT09IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkUmVzdWx0KGRhdGE6IFVpbnQ4QXJyYXksIGltYWdlV2lkdGg6IG51bWJlciwgaW1hZ2VIZWlnaHQ6IG51bWJlciwgY29kZVJlc3VsdDogQmFyY29kZSk6IHZvaWQge1xuICAgICAgICBpZiAoY29kZVJlc3VsdCAmJiB0aGlzLl9jYXBhY2l0eSAmJiAhdGhpcy5fY29udGFpbnMoY29kZVJlc3VsdCkgJiYgdGhpcy5fcGFzc2VzRmlsdGVyKGNvZGVSZXN1bHQpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFF1YWdnYUJhcmNvZGUgPSB7IGNvZGVSZXN1bHQgfTtcblxuICAgICAgICAgICAgdGhpcy5fY2FwYWNpdHktLTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSBpbWFnZVdpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBpbWFnZUhlaWdodDtcblxuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd0ltYWdlKGRhdGEsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0LCB0aGlzLl9jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdC5mcmFtZSA9IHRoaXMuX2NhbnZhcy50b0RhdGFVUkwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZXN1bHRzKCk6IEFycmF5PFF1YWdnYUJhcmNvZGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29udGFpbnMoY29kZVJlc3VsdDogQmFyY29kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmJsYWNrbGlzdCAmJlxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLmJsYWNrbGlzdC5zb21lKGl0ZW0gPT4gT2JqZWN0LmtleXMoaXRlbSkuZXZlcnkoa2V5ID0+IGl0ZW1ba2V5XSA9PT0gY29kZVJlc3VsdFtrZXldKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFzc2VzRmlsdGVyKGNvZGVSZXN1bHQ6IEJhcmNvZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb25maWcuZmlsdGVyICE9PSAnZnVuY3Rpb24nIHx8IHRoaXMuX2NvbmZpZy5maWx0ZXIoY29kZVJlc3VsdCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBFdmVudENhbGxiYWNrIHtcbiAgICAoZGF0YTogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFdmVudFN1YnNjcmlwdGlvbiB7XG4gICAgY2FsbGJhY2s6IEV2ZW50Q2FsbGJhY2s7XG4gICAgYXN5bmM/OiBib29sZWFuO1xuICAgIG9uY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRJdGVtIHtcbiAgICBzdWJzY3JpcHRpb25zOiBBcnJheTxFdmVudFN1YnNjcmlwdGlvbj5cbn1cblxubGV0IGV2ZW50czogeyBbbmFtZTogc3RyaW5nXTogRXZlbnRJdGVtIH0gPSB7fTtcblxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XG4gICAgc3RhdGljIHN1YnNjcmliZShldmVudDogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRTdWJzY3JpcHRpb24gfCBFdmVudENhbGxiYWNrLCBhc3luYz86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbjogRXZlbnRTdWJzY3JpcHRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFzeW5jXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbi5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRocm93ICdDYWxsYmFjayB3YXMgbm90IHNwZWNpZmllZCBvbiBvcHRpb25zJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdldEV2ZW50KGV2ZW50KS5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHVibGlzaCh0eXBlOiBzdHJpbmcsIGRhdGE/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJdGVtID0gZ2V0RXZlbnQodHlwZSk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBldmVudEl0ZW0uc3Vic2NyaXB0aW9ucztcblxuICAgICAgICAvLyBQdWJsaXNoIG9uZS10aW1lIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5maWx0ZXIoKHsgb25jZSB9KSA9PiAhIW9uY2UpLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHB1Ymxpc2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCBkYXRhKSk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc3Vic2NyaXB0aW9uXG4gICAgICAgIGV2ZW50SXRlbS5zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy5maWx0ZXIoKHsgb25jZSB9KSA9PiAhb25jZSk7XG5cbiAgICAgICAgLy8gcHVibGlzaCB0aGUgcmVzdFxuICAgICAgICBldmVudEl0ZW0uc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgZGF0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudENhbGxiYWNrLCBhc3luYz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZShldmVudCwgeyBjYWxsYmFjaywgYXN5bmMsIG9uY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHVuc3Vic2NyaWJlKGV2ZW50TmFtZT86IHN0cmluZywgY2FsbGJhY2s/OiBFdmVudENhbGxiYWNrKSB7XG4gICAgICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZ2V0RXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChldmVudCAmJiBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmlwdGlvbnMgPSBldmVudC5zdWJzY3JpcHRpb25zLmZpbHRlcihzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50cyA9IHt9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRFdmVudChldmVudE5hbWU6IHN0cmluZyk6IEV2ZW50SXRlbSB7XG4gICAgaWYgKCFldmVudHNbZXZlbnROYW1lXSkge1xuICAgICAgICBldmVudHNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IFtdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBldmVudHNbZXZlbnROYW1lXTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb246IEV2ZW50U3Vic2NyaXB0aW9uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLmFzeW5jKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9LCA0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soZGF0YSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IHR5cGUgSFNWID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBSR0IgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBoc3YycmdiKGhzdjogSFNWLCByZ2I/OiBSR0IpOiBSR0Ige1xuICAgIGNvbnN0IGggPSBoc3ZbMF07XG4gICAgY29uc3QgcyA9IGhzdlsxXTtcbiAgICBjb25zdCB2ID0gaHN2WzJdO1xuICAgIGNvbnN0IGMgPSB2ICogcztcbiAgICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKGggLyA2MCkgJSAyIC0gMSkpO1xuICAgIGNvbnN0IG0gPSB2IC0gYztcbiAgICBsZXQgciA9IDA7XG4gICAgbGV0IGcgPSAwO1xuICAgIGxldCBiID0gMDtcblxuICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgciA9IGM7XG4gICAgICAgIGcgPSB4O1xuICAgIH0gZWxzZSBpZiAoaCA8IDEyMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgZyA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMTgwKSB7XG4gICAgICAgIGcgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9IGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgZyA9IHg7XG4gICAgICAgIGIgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDMwMCkge1xuICAgICAgICByID0geDtcbiAgICAgICAgYiA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMzYwKSB7XG4gICAgICAgIHIgPSBjO1xuICAgICAgICBiID0geDtcbiAgICB9XG5cbiAgICByZ2IgPSByZ2IgfHwgWzAsIDAsIDBdO1xuXG4gICAgcmdiWzBdID0gKHIgKyBtKSAqIDI1NSB8IDA7XG4gICAgcmdiWzFdID0gKGcgKyBtKSAqIDI1NSB8IDA7XG4gICAgcmdiWzJdID0gKGIgKyBtKSAqIDI1NSB8IDA7XG5cbiAgICByZXR1cm4gcmdiO1xufVxuIiwiaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnLi9tb21lbnQnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuL3BvaW50JztcbmltcG9ydCB7IEhTViwgaHN2MnJnYiwgUkdCIH0gZnJvbSAnLi9oc3YycmdiJztcblxudHlwZSBBcnJheVR5cGUgPSBBcnJheTxudW1iZXI+IHwgVWludDhBcnJheSB8IEludDMyQXJyYXk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhc2ljIGltYWdlIGNvbWJpbmluZyB0aGUgZGF0YSBhbmQgc2l6ZS5cbiAqIEluIGFkZGl0aW9uLCBzb21lIG1ldGhvZHMgZm9yIG1hbmlwdWxhdGlvbiBhcmUgY29udGFpbmVkLlxuICovXG5leHBvcnQgY2xhc3MgSW1hZ2VXcmFwcGVyPFQgZXh0ZW5kcyBBcnJheVR5cGUgPSBVaW50OEFycmF5PiB7XG4gICAgZGF0YTogVCB8IFVpbnQ4QXJyYXk7XG4gICAgc2l6ZTogUG9pbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxcbiAgICAgKiBAcGFyYW0gZGF0YSBJZiBnaXZlbiwgYSBmbGF0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHBpeGVsIGRhdGFcbiAgICAgKiBAcGFyYW0gYXJyYXlUeXBlIElmIGdpdmVuLCB0aGUgZGVzaXJlZCBEYXRhVHlwZSBvZiB0aGUgQXJyYXkgKG1heSBiZSB0eXBlZC9ub24tdHlwZWQpXG4gICAgICogQHBhcmFtIGluaXRpYWxpemUgSW5kaWNhdGluZyBpZiB0aGUgYXJyYXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIG9uIGNyZWF0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNpemU6IFBvaW50LCBkYXRhPzogVCwgYXJyYXlUeXBlPzogeyBuZXcoXzogbnVtYmVyKTogVCB8IFVpbnQ4QXJyYXkgfSwgaW5pdGlhbGl6ZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgKGFycmF5VHlwZSB8fCBVaW50OEFycmF5KShzaXplLnggKiBzaXplLnkpO1xuXG4gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWxsKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgYSBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlIGltYWdlIHdpdGggYSBnaXZlbiBvZmZzZXRcbiAgICAgKiBAcGFyYW0gcG9pbnQgVGhlIGxvY2F0aW9uIHRvIHRlc3RcbiAgICAgKiBAcGFyYW0gYm9yZGVyIFRoZSBwYWRkaW5nIHZhbHVlIGluIHBpeGVsc1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgbG9jYXRpb24gaW5zaWRlIHRoZSBpbWFnZSdzIGJvcmRlciwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQHNlZSBjdmQvaW1hZ2UuaFxuICAgICAqL1xuICAgIGluSW1hZ2VXaXRoQm9yZGVyKHBvaW50OiBQb2ludCwgYm9yZGVyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChwb2ludC54ID49IGJvcmRlcilcbiAgICAgICAgICAgICYmIChwb2ludC55ID49IGJvcmRlcilcbiAgICAgICAgICAgICYmIChwb2ludC54IDwgKHRoaXMuc2l6ZS54IC0gYm9yZGVyKSlcbiAgICAgICAgICAgICYmIChwb2ludC55IDwgKHRoaXMuc2l6ZS55IC0gYm9yZGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7SW1hZ2VXcmFwcGVyKSBhbmQgY29waWVzIHRoZSBuZWVkZWQgdW5kZXJseWluZyBpbWFnZS1kYXRhIGFyZWFcbiAgICAgKiBAcGFyYW0gaW1hZ2VXcmFwcGVyIFRoZSB0YXJnZXQge0ltYWdlV3JhcHBlcn0gd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSBmcm9tWCBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiB3aGVyZSB0byBjb3B5IGZyb21cbiAgICAgKiBAcGFyYW0gZnJvbVkgVGhlIHZlcnRpY2FsIHBvc2l0aW9uIHdoZXJlIHRvIGNvcHkgZnJvbVxuICAgICovXG4gICAgc3ViSW1hZ2VBc0NvcHkoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGZyb21YOiBudW1iZXIsIGZyb21ZOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2l6ZVkgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgICAgICBjb25zdCBzaXplWCA9IGltYWdlV3JhcHBlci5zaXplLng7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzaXplWDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemVZOyB5KyspIHtcbiAgICAgICAgICAgICAgICBpbWFnZVdyYXBwZXIuZGF0YVt5ICogc2l6ZVggKyB4XSA9IHRoaXMuZGF0YVsoZnJvbVkgKyB5KSAqIHRoaXMuc2l6ZS54ICsgZnJvbVggKyB4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIGdpdmVuIHBpeGVsIHBvc2l0aW9uIGZyb20gdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHggVGhlIHgtcG9zaXRpb25cbiAgICAgKiBAcGFyYW0geSBUaGUgeS1wb3NpdGlvblxuICAgICAqIEByZXR1cm5zIFRoZSBncmF5c2NhbGUgdmFsdWUgYXQgdGhlIHBpeGVsLXBvc2l0aW9uXG4gICAgICovXG4gICAgZ2V0KHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gaW4gdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHggVGhlIHgtcG9zaXRpb25cbiAgICAgKiBAcGFyYW0geSBUaGUgeS1wb3NpdGlvblxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZ3JheXNjYWxlIHZhbHVlIHRvIHNldFxuICAgICAqIEByZXR1cm5zIFRoZSBJbWFnZSBpdHNlbGYgKGZvciBwb3NzaWJsZSBjaGFpbmluZylcbiAgICAgKi9cbiAgICBzZXQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJbWFnZVdyYXBwZXI8VD4ge1xuICAgICAgICB0aGlzLmRhdGFbeSAqIHRoaXMuc2l6ZS54ICsgeF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYm9yZGVyIG9mIHRoZSBpbWFnZSAoMSBwaXhlbCkgdG8gemVyb1xuICAgICAqL1xuICAgIHplcm9Cb3JkZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5zaXplLng7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuc2l6ZS55O1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgICAgICAgICAgZGF0YVtpXSA9IGRhdGFbKGhlaWdodCAtIDEpICogd2lkdGggKyBpXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhlaWdodCAtIDE7IGkrKykge1xuICAgICAgICAgICAgZGF0YVtpICogd2lkdGhdID0gZGF0YVtpICogd2lkdGggKyAod2lkdGggLSAxKV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52ZXJ0cyBhIGJpbmFyeSBpbWFnZSBpbiBwbGFjZVxuICAgICAqL1xuICAgIGludmVydCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblxuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBkYXRhW2ldID8gMCA6IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb21lbnRzKGxhYmVsQ291bnQ6IG51bWJlcik6IEFycmF5PE1vbWVudD4ge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnNpemUueTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnNpemUueDtcbiAgICAgICAgY29uc3QgbGFiZWxTdW0gPSBuZXcgQXJyYXk8TW9tZW50PigpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8TW9tZW50PigpO1xuXG4gICAgICAgIGlmIChsYWJlbENvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhYmVsQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGFiZWxTdW1baV0gPSB7XG4gICAgICAgICAgICAgICAgbTAwOiAwLFxuICAgICAgICAgICAgICAgIG0wMTogMCxcbiAgICAgICAgICAgICAgICBtMTA6IDAsXG4gICAgICAgICAgICAgICAgbTExOiAwLFxuICAgICAgICAgICAgICAgIG0wMjogMCxcbiAgICAgICAgICAgICAgICBtMjA6IDAsXG4gICAgICAgICAgICAgICAgdGhldGE6IDAsXG4gICAgICAgICAgICAgICAgcmFkOiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeXNxID0geSAqIHk7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmRhdGFbeSAqIHdpZHRoICsgeF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbFN1bVt2YWwgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTAwICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0wMSArPSB5O1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMTAgKz0geDtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTExICs9IHggKiB5O1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMDIgKz0geXNxO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMjAgKz0geCAqIHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgUEkgPSBNYXRoLlBJO1xuICAgICAgICBjb25zdCBQSV80ID0gUEkgLyA0O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGxhYmVsU3VtW2ldO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsYWJlbC5tMDApICYmIGxhYmVsLm0wMCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhfID0gbGFiZWwubTEwIC8gbGFiZWwubTAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlfID0gbGFiZWwubTAxIC8gbGFiZWwubTAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG11MTEgPSBsYWJlbC5tMTEgLyBsYWJlbC5tMDAgLSB4XyAqIHlfO1xuICAgICAgICAgICAgICAgIGNvbnN0IG11MDIgPSBsYWJlbC5tMDIgLyBsYWJlbC5tMDAgLSB5XyAqIHlfO1xuICAgICAgICAgICAgICAgIGNvbnN0IG11MjAgPSBsYWJlbC5tMjAgLyBsYWJlbC5tMDAgLSB4XyAqIHhfO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IDAuNSAqIE1hdGguYXRhbigobXUwMiAtIG11MjApIC8gKDIgKiBtdTExKSkgKyAobXUxMSA+PSAwID8gUElfNCA6IC1QSV80KSArIFBJO1xuICAgICAgICAgICAgICAgIGxhYmVsLnRoZXRhID0gKHRtcCAqIDE4MCAvIFBJICsgOTApICUgMTgwIC0gOTA7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsLnRoZXRhIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC50aGV0YSArPSAxODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhYmVsLnJhZCA9IHRtcCA+IFBJID8gdG1wIC0gUEkgOiB0bXA7XG4gICAgICAgICAgICAgICAgbGFiZWwueCA9IE1hdGguY29zKHRtcCk7XG4gICAgICAgICAgICAgICAgbGFiZWwueSA9IE1hdGguc2luKHRtcCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyB0aGUge0ltYWdlV3JhcHBlcn0gaW4gYSBnaXZlbiBjYW52YXNcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgcmVuZGVyaW5nIGNvbnRleHQgdG8gd3JpdGUgdG9cbiAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGUgd2hpY2ggaXMgYXBwbGllZCB0byBlYWNoIHBpeGVsLXZhbHVlXG4gICAgICovXG4gICAgc2hvdyhjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5zaXplLng7XG4gICAgICAgIC8vIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgLy8gY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgLy8gY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBmcmFtZS5kYXRhO1xuICAgICAgICBsZXQgY3VycmVudCA9IDA7XG5cbiAgICAgICAgaWYgKCFzY2FsZSkge1xuICAgICAgICAgICAgc2NhbGUgPSAxLjA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHkgKiB3aWR0aCArIHg7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuZ2V0KHgsIHkpICogc2NhbGU7XG4gICAgICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAwXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAxXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAyXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgZGF0YVtwaXhlbCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZnJhbWUuZGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyB0aGUgcGFydCBvZiB0aGUgaW1hZ2UgaW4gYSBnaXZlbiBjYW52YXNcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgcmVuZGVyaW5nIGNvbnRleHQgdG8gd3JpdGUgdG9cbiAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGUgd2hpY2ggaXMgYXBwbGllZCB0byBlYWNoIHBpeGVsLXZhbHVlXG4gICAgICogQHBhcmFtIGZyb21YIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIHdoZXJlIHRvIG92ZXJsYXkgZnJvbVxuICAgICAqIEBwYXJhbSBmcm9tWSBUaGUgdmVydGljYWwgcG9zaXRpb24gd2hlcmUgdG8gb3ZlcmxheSBmcm9tXG4gICAgICovXG4gICAgb3ZlcmxheShjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHNjYWxlOiBudW1iZXIsIGZyb21YOiBudW1iZXIsIGZyb21ZOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaHN2OiBIU1YgPSBbMCwgMSwgMV07XG4gICAgICAgIGNvbnN0IHdoaXRlUmdiOiBSR0IgPSBbMjU1LCAyNTUsIDI1NV07XG4gICAgICAgIGNvbnN0IGJsYWNrUmdiOiBSR0IgPSBbMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IGZyYW1lID0gY29udGV4dC5nZXRJbWFnZURhdGEoZnJvbVgsIGZyb21ZLCB0aGlzLnNpemUueCwgdGhpcy5zaXplLnkpO1xuICAgICAgICBjb25zdCBkYXRhID0gZnJhbWUuZGF0YTtcblxuICAgICAgICBpZiAoIXNjYWxlIHx8IHNjYWxlIDwgMCB8fCBzY2FsZSA+IDM2MCkge1xuICAgICAgICAgICAgc2NhbGUgPSAzNjA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBsZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoOyBsZW5ndGgtLTspIHtcbiAgICAgICAgICAgIGhzdlswXSA9IHRoaXMuZGF0YVtsZW5ndGhdICogc2NhbGU7XG4gICAgICAgICAgICBjb25zdCByZ2I6IFJHQiA9IGhzdlswXSA8PSAwID8gd2hpdGVSZ2IgOiBoc3ZbMF0gPj0gMzYwID8gYmxhY2tSZ2IgOiBoc3YycmdiKGhzdik7XG4gICAgICAgICAgICBkYXRhW2xlbmd0aCAqIDQgKyAwXSA9IHJnYlswXTtcbiAgICAgICAgICAgIGRhdGFbbGVuZ3RoICogNCArIDFdID0gcmdiWzFdO1xuICAgICAgICAgICAgZGF0YVtsZW5ndGggKiA0ICsgMl0gPSByZ2JbMl07XG4gICAgICAgICAgICBkYXRhW2xlbmd0aCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGZyYW1lLCBmcm9tWCwgZnJvbVkpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIG1lcmdlIG9mIG9iamVjdHMgYW5kIHJldHVybnMgbmV3IG9iamVjdC5cbiAqIERvZXMgbm90IG1vZGlmeSBvYmplY3RzIChpbW11dGFibGUpLlxuICogQHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDgyMTgyMDlcbiAqXG4gKiBAcGFyYW0gb2JqZWN0cyAtIE9iamVjdHMgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIE5ldyBvYmplY3Qgd2l0aCBtZXJnZWQga2V5L3ZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoLi4ub2JqZWN0czogUmVhZG9ubHlBcnJheTxhbnk+KTogb2JqZWN0IHtcbiAgICBjb25zdCBpc09iamVjdCA9IChvYmo6IHVua25vd24pID0+IG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JztcblxuICAgIHJldHVybiBvYmplY3RzLnJlZHVjZSgocHJldiwgb2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBWYWwgPSBwcmV2W2tleV07XG4gICAgICAgICAgICAgICAgY29uc3Qgb1ZhbCA9IG9ialtrZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocFZhbCkgJiYgQXJyYXkuaXNBcnJheShvVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2W2tleV0gPSBwVmFsLmNvbmNhdCguLi5vVmFsKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldltrZXldID0gb1ZhbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBWYWwpICYmIGlzT2JqZWN0KG9WYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZba2V5XSA9IG1lcmdlKHBWYWwsIG9WYWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZba2V5XSA9IG9WYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSk7XG59IiwiaW1wb3J0IHsgUXVhZ2dhQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5leHBvcnQgY29uc3QgY29uZmlnOiBRdWFnZ2FDb25maWcgPSB7XG4gICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgdHlwZTogJ0ltYWdlU3RyZWFtJyxcbiAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICBzaXplOiA4MDAsXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJ1xuICAgICAgICB9LFxuICAgICAgICBzaW5nbGVDaGFubmVsOiBmYWxzZSAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiAwLFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcidcbiAgICAgICAgXVxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nIC8vIHgtc21hbGwsIHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4LWxhcmdlXG4gICAgfVxufTtcbiIsImV4cG9ydCBlbnVtIEJhcmNvZGVEaXJlY3Rpb24ge1xuICAgIEZvcndhcmQgPSAxLFxuICAgIFJldmVyc2UgPSAtMVxufTtcblxuZXhwb3J0IHR5cGUgQmFyY29kZUZvcm1hdCA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgQmFyY29kZVJlYWRlclR5cGUgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEJhcmNvZGVSZWFkZXJEZWNsYXJhdGlvbiA9IEJhcmNvZGVSZWFkZXJUeXBlIHwgeyBmb3JtYXQ6IEJhcmNvZGVSZWFkZXJUeXBlOyBjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWc7IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZVJlYWRlckNvbmZpZyB7XG4gICAgbm9ybWFsaXplQmFyU3BhY2VXaWR0aD86IGJvb2xlYW47XG4gICAgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyVHlwZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZUNvcnJlY3Rpb24ge1xuICAgIGJhcjogbnVtYmVyO1xuICAgIHNwYWNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZUluZm8ge1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgY29ycmVjdGlvbj86IEJhcmNvZGVDb3JyZWN0aW9uO1xuICAgIGVuZD86IG51bWJlcjtcbiAgICBlbmRDb3VudGVyPzogbnVtYmVyO1xuICAgIGVycm9yPzogbnVtYmVyO1xuICAgIHN0YXJ0PzogbnVtYmVyO1xuICAgIHN0YXJ0Q291bnRlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlIHtcbiAgICBjb2RlPzogc3RyaW5nO1xuICAgIGNvZGVzZXQ/OiBudW1iZXI7XG4gICAgY29ycmVjdGlvbj86IEJhcmNvZGVDb3JyZWN0aW9uO1xuICAgIGRlY29kZWRDb2Rlcz86IEFycmF5PHN0cmluZyB8IEJhcmNvZGVJbmZvPjtcbiAgICBkaXJlY3Rpb24/OiBCYXJjb2RlRGlyZWN0aW9uO1xuICAgIGVuZD86IG51bWJlcjtcbiAgICBlbmRJbmZvPzogQmFyY29kZUluZm87XG4gICAgZm9ybWF0PzogQmFyY29kZUZvcm1hdDtcbiAgICBzdGFydD86IG51bWJlcjtcbiAgICBzdGFydEluZm8/OiBCYXJjb2RlSW5mbztcbiAgICBzdXBwbGVtZW50PzogQmFyY29kZTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByb3RlY3RlZCBfc2luZ2xlQ29kZUVycm9yOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9hdmVyYWdlQ29kZUVycm9yOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IEJhcmNvZGVGb3JtYXQ7XG4gICAgcHJvdGVjdGVkIF9yb3c6IEFycmF5PG51bWJlcj47XG5cbiAgICBjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWc7XG4gICAgc3VwcGxlbWVudHM6IEFycmF5PEJhcmNvZGVSZWFkZXI+O1xuXG4gICAgc3RhdGljIGdldCBFeGNlcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBTdGFydE5vdEZvdW5kRXhjZXB0aW9uOiAnU3RhcnQtSW5mbyB3YXMgbm90IGZvdW5kIScsXG4gICAgICAgICAgICBDb2RlTm90Rm91bmRFeGNlcHRpb246ICdDb2RlIGNvdWxkIG5vdCBiZSBmb3VuZCEnLFxuICAgICAgICAgICAgUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uOiAnUGF0dGVybiBjb3VsZCBub3QgYmUgZm91bmQhJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBTSU5HTEVfQ09ERV9FUlJPUigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2luZ2xlQ29kZUVycm9yO1xuICAgIH1cblxuICAgIGdldCBBVkVSQUdFX0NPREVfRVJST1IoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2ZXJhZ2VDb2RlRXJyb3I7XG4gICAgfVxuXG4gICAgZ2V0IEZPUk1BVCgpOiBCYXJjb2RlRm9ybWF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICd1bmtub3duJztcbiAgICAgICAgdGhpcy5fcm93ID0gW107XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgICB0aGlzLnN1cHBsZW1lbnRzID0gc3VwcGxlbWVudHM7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogQmFyY29kZTtcblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogMCB8IDEsIHRyeUhhcmRlcjogYm9vbGVhbik6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IG5ldyBBcnJheTxudW1iZXI+KHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkVSQUdFX0NPREVfRVJST1I7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY291bnRlci5maWxsKDApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIGNvdW50ZXIucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodHJ5SGFyZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoIC0gMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDJdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAxXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9IGlzV2hpdGUgPyAwIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25leHRVbnNldChsaW5lOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHN0YXJ0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0IHx8IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9uZXh0U2V0KGxpbmU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQgfHwgMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWF0Y2hSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQgPCAwID8gMCA6IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWF0Y2hQYXR0ZXJuKGNvdW50ZXI6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgY29kZTogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBtYXhTaW5nbGVFcnJvcj86IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBlcnJvciA9IDA7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgbW9kdWxvID0gMDtcblxuICAgICAgICBtYXhTaW5nbGVFcnJvciA9IG1heFNpbmdsZUVycm9yIHx8IHRoaXMuU0lOR0xFX0NPREVfRVJST1IgfHwgMTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2ldO1xuICAgICAgICAgICAgbW9kdWxvICs9IGNvZGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VtIDwgbW9kdWxvKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhcldpZHRoID0gc3VtIC8gbW9kdWxvO1xuICAgICAgICBtYXhTaW5nbGVFcnJvciAqPSBiYXJXaWR0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY291bnRlcltpXTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZCA9IGNvZGVbaV0gKiBiYXJXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZUVycm9yID0gTWF0aC5hYnMoY291bnQgLSBzY2FsZWQpIC8gc2NhbGVkO1xuXG4gICAgICAgICAgICBpZiAoc2luZ2xlRXJyb3IgPiBtYXhTaW5nbGVFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvciArPSBzaW5nbGVFcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvciAvIG1vZHVsbztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NvcnJlY3RCYXJzKGNvdW50ZXI6IEFycmF5PG51bWJlcj4sIGNvcnJlY3Rpb246IG51bWJlciwgaW5kaWNlczogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBsZXQgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgIGxldCB0bXAgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgICAgdG1wID0gY291bnRlcltpbmRpY2VzW2xlbmd0aF1dICogKDEgLSAoKDEgLSBjb3JyZWN0aW9uKSAvIDIpKTtcbiAgICAgICAgICAgIGlmICh0bXAgPiAxKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpbmRpY2VzW2xlbmd0aF1dID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVjb2RlUGF0dGVybihwYXR0ZXJuOiBBcnJheTxudW1iZXI+KTogQmFyY29kZSB7XG4gICAgICAgIHRoaXMuX3JvdyA9IHBhdHRlcm47XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRlY29kZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kaXJlY3Rpb24gPSBCYXJjb2RlRGlyZWN0aW9uLlJldmVyc2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5zdGFydDtcbiAgICAgICAgICAgICAgICByZXN1bHQuZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHJlc3VsdC5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZURpcmVjdGlvbi5Gb3J3YXJkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0LmZvcm1hdCA9IHRoaXMuRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfZmlsbENvdW50ZXJzKG9mZnNldDogbnVtYmVyLCBlbmQ6IG51bWJlciwgaXNXaGl0ZTogMCB8IDEpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgY291bnRlcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnRlcnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90b0NvdW50ZXJzKHN0YXJ0OiBudW1iZXIsIGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IFVpbnQxNkFycmF5IHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGg7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IHRoaXMuX3Jvd1tzdGFydF0gPyAwIDogMTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGNvdW50ZXJzLmZpbGwoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBudW1Db3VudGVycykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50ZXJzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVDb3JyZWN0aW9uLCBCYXJjb2RlSW5mbywgQmFyY29kZVJlYWRlciB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuXG5jb25zdCBDT0RFX1NISUZUID0gOTg7XG5jb25zdCBDT0RFX0MgPSA5OTtcbmNvbnN0IENPREVfQiA9IDEwMDtcbmNvbnN0IENPREVfQSA9IDEwMTtcbmNvbnN0IFNUQVJUX0NPREVfQSA9IDEwMztcbmNvbnN0IFNUQVJUX0NPREVfQiA9IDEwNDtcbmNvbnN0IFNUQVJUX0NPREVfQyA9IDEwNTtcbmNvbnN0IFNUT1BfQ09ERSA9IDEwNjtcbmNvbnN0IENPREVfUEFUVEVSTiA9IFtcbiAgICBbMiwgMSwgMiwgMiwgMiwgMl0sXG4gICAgWzIsIDIsIDIsIDEsIDIsIDJdLFxuICAgIFsyLCAyLCAyLCAyLCAyLCAxXSxcbiAgICBbMSwgMiwgMSwgMiwgMiwgM10sXG4gICAgWzEsIDIsIDEsIDMsIDIsIDJdLFxuICAgIFsxLCAzLCAxLCAyLCAyLCAyXSxcbiAgICBbMSwgMiwgMiwgMiwgMSwgM10sXG4gICAgWzEsIDIsIDIsIDMsIDEsIDJdLFxuICAgIFsxLCAzLCAyLCAyLCAxLCAyXSxcbiAgICBbMiwgMiwgMSwgMiwgMSwgM10sXG4gICAgWzIsIDIsIDEsIDMsIDEsIDJdLFxuICAgIFsyLCAzLCAxLCAyLCAxLCAyXSxcbiAgICBbMSwgMSwgMiwgMiwgMywgMl0sXG4gICAgWzEsIDIsIDIsIDEsIDMsIDJdLFxuICAgIFsxLCAyLCAyLCAyLCAzLCAxXSxcbiAgICBbMSwgMSwgMywgMiwgMiwgMl0sXG4gICAgWzEsIDIsIDMsIDEsIDIsIDJdLFxuICAgIFsxLCAyLCAzLCAyLCAyLCAxXSxcbiAgICBbMiwgMiwgMywgMiwgMSwgMV0sXG4gICAgWzIsIDIsIDEsIDEsIDMsIDJdLFxuICAgIFsyLCAyLCAxLCAyLCAzLCAxXSxcbiAgICBbMiwgMSwgMywgMiwgMSwgMl0sXG4gICAgWzIsIDIsIDMsIDEsIDEsIDJdLFxuICAgIFszLCAxLCAyLCAxLCAzLCAxXSxcbiAgICBbMywgMSwgMSwgMiwgMiwgMl0sXG4gICAgWzMsIDIsIDEsIDEsIDIsIDJdLFxuICAgIFszLCAyLCAxLCAyLCAyLCAxXSxcbiAgICBbMywgMSwgMiwgMiwgMSwgMl0sXG4gICAgWzMsIDIsIDIsIDEsIDEsIDJdLFxuICAgIFszLCAyLCAyLCAyLCAxLCAxXSxcbiAgICBbMiwgMSwgMiwgMSwgMiwgM10sXG4gICAgWzIsIDEsIDIsIDMsIDIsIDFdLFxuICAgIFsyLCAzLCAyLCAxLCAyLCAxXSxcbiAgICBbMSwgMSwgMSwgMywgMiwgM10sXG4gICAgWzEsIDMsIDEsIDEsIDIsIDNdLFxuICAgIFsxLCAzLCAxLCAzLCAyLCAxXSxcbiAgICBbMSwgMSwgMiwgMywgMSwgM10sXG4gICAgWzEsIDMsIDIsIDEsIDEsIDNdLFxuICAgIFsxLCAzLCAyLCAzLCAxLCAxXSxcbiAgICBbMiwgMSwgMSwgMywgMSwgM10sXG4gICAgWzIsIDMsIDEsIDEsIDEsIDNdLFxuICAgIFsyLCAzLCAxLCAzLCAxLCAxXSxcbiAgICBbMSwgMSwgMiwgMSwgMywgM10sXG4gICAgWzEsIDEsIDIsIDMsIDMsIDFdLFxuICAgIFsxLCAzLCAyLCAxLCAzLCAxXSxcbiAgICBbMSwgMSwgMywgMSwgMiwgM10sXG4gICAgWzEsIDEsIDMsIDMsIDIsIDFdLFxuICAgIFsxLCAzLCAzLCAxLCAyLCAxXSxcbiAgICBbMywgMSwgMywgMSwgMiwgMV0sXG4gICAgWzIsIDEsIDEsIDMsIDMsIDFdLFxuICAgIFsyLCAzLCAxLCAxLCAzLCAxXSxcbiAgICBbMiwgMSwgMywgMSwgMSwgM10sXG4gICAgWzIsIDEsIDMsIDMsIDEsIDFdLFxuICAgIFsyLCAxLCAzLCAxLCAzLCAxXSxcbiAgICBbMywgMSwgMSwgMSwgMiwgM10sXG4gICAgWzMsIDEsIDEsIDMsIDIsIDFdLFxuICAgIFszLCAzLCAxLCAxLCAyLCAxXSxcbiAgICBbMywgMSwgMiwgMSwgMSwgM10sXG4gICAgWzMsIDEsIDIsIDMsIDEsIDFdLFxuICAgIFszLCAzLCAyLCAxLCAxLCAxXSxcbiAgICBbMywgMSwgNCwgMSwgMSwgMV0sXG4gICAgWzIsIDIsIDEsIDQsIDEsIDFdLFxuICAgIFs0LCAzLCAxLCAxLCAxLCAxXSxcbiAgICBbMSwgMSwgMSwgMiwgMiwgNF0sXG4gICAgWzEsIDEsIDEsIDQsIDIsIDJdLFxuICAgIFsxLCAyLCAxLCAxLCAyLCA0XSxcbiAgICBbMSwgMiwgMSwgNCwgMiwgMV0sXG4gICAgWzEsIDQsIDEsIDEsIDIsIDJdLFxuICAgIFsxLCA0LCAxLCAyLCAyLCAxXSxcbiAgICBbMSwgMSwgMiwgMiwgMSwgNF0sXG4gICAgWzEsIDEsIDIsIDQsIDEsIDJdLFxuICAgIFsxLCAyLCAyLCAxLCAxLCA0XSxcbiAgICBbMSwgMiwgMiwgNCwgMSwgMV0sXG4gICAgWzEsIDQsIDIsIDEsIDEsIDJdLFxuICAgIFsxLCA0LCAyLCAyLCAxLCAxXSxcbiAgICBbMiwgNCwgMSwgMiwgMSwgMV0sXG4gICAgWzIsIDIsIDEsIDEsIDEsIDRdLFxuICAgIFs0LCAxLCAzLCAxLCAxLCAxXSxcbiAgICBbMiwgNCwgMSwgMSwgMSwgMl0sXG4gICAgWzEsIDMsIDQsIDEsIDEsIDFdLFxuICAgIFsxLCAxLCAxLCAyLCA0LCAyXSxcbiAgICBbMSwgMiwgMSwgMSwgNCwgMl0sXG4gICAgWzEsIDIsIDEsIDIsIDQsIDFdLFxuICAgIFsxLCAxLCA0LCAyLCAxLCAyXSxcbiAgICBbMSwgMiwgNCwgMSwgMSwgMl0sXG4gICAgWzEsIDIsIDQsIDIsIDEsIDFdLFxuICAgIFs0LCAxLCAxLCAyLCAxLCAyXSxcbiAgICBbNCwgMiwgMSwgMSwgMSwgMl0sXG4gICAgWzQsIDIsIDEsIDIsIDEsIDFdLFxuICAgIFsyLCAxLCAyLCAxLCA0LCAxXSxcbiAgICBbMiwgMSwgNCwgMSwgMiwgMV0sXG4gICAgWzQsIDEsIDIsIDEsIDIsIDFdLFxuICAgIFsxLCAxLCAxLCAxLCA0LCAzXSxcbiAgICBbMSwgMSwgMSwgMywgNCwgMV0sXG4gICAgWzEsIDMsIDEsIDEsIDQsIDFdLFxuICAgIFsxLCAxLCA0LCAxLCAxLCAzXSxcbiAgICBbMSwgMSwgNCwgMywgMSwgMV0sXG4gICAgWzQsIDEsIDEsIDEsIDEsIDNdLFxuICAgIFs0LCAxLCAxLCAzLCAxLCAxXSxcbiAgICBbMSwgMSwgMywgMSwgNCwgMV0sXG4gICAgWzEsIDEsIDQsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAxLCAxLCA0LCAxXSxcbiAgICBbNCwgMSwgMSwgMSwgMywgMV0sXG4gICAgWzIsIDEsIDEsIDQsIDEsIDJdLFxuICAgIFsyLCAxLCAxLCAyLCAxLCA0XSxcbiAgICBbMiwgMSwgMSwgMiwgMywgMl0sXG4gICAgWzIsIDMsIDMsIDEsIDEsIDEsIDJdXG5dO1xuY29uc3QgTU9EVUxFX0lORElDRVMgPSB7IGJhcjogWzAsIDIsIDRdLCBzcGFjZTogWzEsIDMsIDVdIH07XG5cbmV4cG9ydCBjbGFzcyBDb2RlMTI4UmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2NvZGVfMTI4JztcbiAgICAgICAgdGhpcy5fc2luZ2xlQ29kZUVycm9yID0gMC42NDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUNvZGVFcnJvciA9IDAuMzA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvcnJlY3Rpb246IEJhcmNvZGVDb3JyZWN0aW9uKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBzdGFydDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0LFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogMSxcbiAgICAgICAgICAgICAgICBzcGFjZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkVSQUdFX0NPREVfRVJST1I7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IHRoaXMuX3Jvd1tvZmZzZXRdID8gMCA6IDE7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ycmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29ycmVjdChjb3VudGVyLCBjb3JyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBDT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5jb2RlID09PSAtMSB8fCBiZXN0TWF0Y2guZXJyb3IgPiBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29ycmVjdGlvbi5iYXIgPSB0aGlzLl9jYWxjdWxhdGVDb3JyZWN0aW9uKGV4cGVjdGVkLCBjb3VudGVyLCBNT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLl9jYWxjdWxhdGVDb3JyZWN0aW9uKGV4cGVjdGVkLCBjb3VudGVyLCBNT0RVTEVfSU5ESUNFUy5zcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gaXNXaGl0ZSA/IDAgOiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29ycmVjdChjb3VudGVyOiBBcnJheTxudW1iZXI+LCBjb3JyZWN0aW9uOiBCYXJjb2RlQ29ycmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLmJhciwgTU9EVUxFX0lORElDRVMuYmFyKTtcbiAgICAgICAgdGhpcy5fY29ycmVjdEJhcnMoY291bnRlciwgY29ycmVjdGlvbi5zcGFjZSwgTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCkge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZFUkFHRV9DT0RFX0VSUk9SO1xuICAgICAgICBsZXQgaXNXaGl0ZTogMCB8IDEgPSAwO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGxldCBzdW06IG51bWJlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gaXNXaGl0ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzdW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2pdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSBTVEFSVF9DT0RFX0E7IGNvZGUgPD0gU1RBUlRfQ09ERV9DOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuX2NhbGN1bGF0ZUNvcnJlY3Rpb24oQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLl9jYWxjdWxhdGVDb3JyZWN0aW9uKENPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls0XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gaXNXaGl0ZSA/IDAgOiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvID0gbnVsbDtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgbGV0IG11bHRpcGxpZXIgPSAwO1xuICAgICAgICBsZXQgY2hlY2tzdW0gPSAwO1xuICAgICAgICBsZXQgY29kZXNldDogbnVtYmVyO1xuICAgICAgICBsZXQgcmF3UmVzdWx0ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgICAgICAgbGV0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcbiAgICAgICAgbGV0IHNoaWZ0TmV4dCA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5zaGlmdDogYm9vbGVhbjtcbiAgICAgICAgbGV0IHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGFydEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvZGUgPSB7XG4gICAgICAgICAgICBjb2RlOiBzdGFydEluZm8uY29kZSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0SW5mby5lbmQsXG4gICAgICAgICAgICBjb3JyZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgYmFyOiBzdGFydEluZm8uY29ycmVjdGlvbi5iYXIsXG4gICAgICAgICAgICAgICAgc3BhY2U6IHN0YXJ0SW5mby5jb3JyZWN0aW9uLnNwYWNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICBjaGVja3N1bSA9IGNvZGUuY29kZTtcblxuICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgY2FzZSBTVEFSVF9DT0RFX0E6XG4gICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU1RBUlRfQ09ERV9COlxuICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0I7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNUQVJUX0NPREVfQzpcbiAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9DO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICAgICAgdW5zaGlmdCA9IHNoaWZ0TmV4dDtcbiAgICAgICAgICAgIHNoaWZ0TmV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIGNvZGUuY29ycmVjdGlvbik7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IFNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSBTVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmF3UmVzdWx0LnB1c2goY29kZS5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllcisrO1xuICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSArPSBtdWx0aXBsaWVyICogY29kZS5jb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZXNldCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgzMiArIGNvZGUuY29kZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlLmNvZGUgPCA5Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZS5jb2RlIC0gNjQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX1NISUZUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnROZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfQ09ERTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPCA5Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMzIgKyBjb2RlLmNvZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX1NISUZUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnROZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gQ09ERV9BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfQ09ERTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0RFX0M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPCAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgPCAxMCA/ICcwJyArIGNvZGUuY29kZSA6IGNvZGUuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IFNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ERV9BOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IENPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSBDT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnNoaWZ0KSB7XG4gICAgICAgICAgICAgICAgY29kZXNldCA9IGNvZGVzZXQgPT09IENPREVfQSA/IENPREVfQiA6IENPREVfQTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUuZW5kID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShjb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja3N1bSAtPSBtdWx0aXBsaWVyICogcmF3UmVzdWx0W3Jhd1Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGNoZWNrc3VtICUgMTAzICE9PSByYXdSZXN1bHRbcmF3UmVzdWx0Lmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgbGFzdCBjb2RlIGZyb20gcmVzdWx0IChjaGVja3N1bSlcbiAgICAgICAgaWYgKHJlbW92ZUxhc3RDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UocmVzdWx0Lmxlbmd0aCAtIDEsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvZGUuZW5kLFxuICAgICAgICAgICAgY29kZXNldCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIGVuZEluZm86IGNvZGVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvOiBCYXJjb2RlSW5mbyk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoZW5kSW5mby5lbmQgLSBlbmRJbmZvLnN0YXJ0KSAvIDI7XG5cbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHRoaXMuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVDb3JyZWN0aW9uKFxuICAgICAgICBleHBlY3RlZDogUmVhZG9ubHlBcnJheTxudW1iZXI+LFxuICAgICAgICBub3JtYWxpemVkOiBSZWFkb25seUFycmF5PG51bWJlcj4sXG4gICAgICAgIGluZGljZXM6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPlxuICAgICk6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW1Ob3JtYWxpemVkID0gMDtcbiAgICAgICAgbGV0IHN1bUV4cGVjdGVkID0gMDtcblxuICAgICAgICBmb3IgKGxldCBsZW5ndGggPSBpbmRpY2VzLmxlbmd0aDsgbGVuZ3RoLS07KSB7XG4gICAgICAgICAgICBzdW1FeHBlY3RlZCArPSBleHBlY3RlZFtpbmRpY2VzW2xlbmd0aF1dO1xuICAgICAgICAgICAgc3VtTm9ybWFsaXplZCArPSBub3JtYWxpemVkW2luZGljZXNbbGVuZ3RoXV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtRXhwZWN0ZWQgLyBzdW1Ob3JtYWxpemVkO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IEFTVEVSSVNLID0gMHgwOTQ7XG5jb25zdCBBTFBIQUJFVEhfU1RSSU5HID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICokLyslJztcbmNvbnN0IEFMUEhBQkVUID0gbmV3IFVpbnQxNkFycmF5KFsuLi5BTFBIQUJFVEhfU1RSSU5HXS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbi8vIGNvbnN0IEFMUEhBQkVUID0gWzQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsXG4vLyAgICAgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgNDUsIDQ2LCAzMiwgNDIsIDM2LCA0NywgNDMsIDM3XTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MDM0LCAweDEyMSwgMHgwNjEsIDB4MTYwLCAweDAzMSwgMHgxMzAsIDB4MDcwLCAweDAyNSwgMHgxMjQsIDB4MDY0LCAweDEwOSwgMHgwNDksIDB4MTQ4LCAweDAxOSwgMHgxMTgsIDB4MDU4LFxuICAgIDB4MDBELCAweDEwQywgMHgwNEMsIDB4MDFDLCAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywgMHgxMDYsIDB4MDQ2LCAweDAxNiwgMHgxODEsIDB4MEMxLFxuICAgIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLCAweDA4NSwgMHgxODQsIDB4MEM0LCAweDA5NCwgMHgwQTgsIDB4MEEyLCAweDA4QSwgMHgwMkFcbl0pO1xuXG5leHBvcnQgY2xhc3MgQ29kZTM5UmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2NvZGVfMzknO1xuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9maW5kU3RhcnQoKTtcblxuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheSg5KTtcbiAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmc7XG4gICAgICAgIGxldCBsYXN0U3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBzdGFydC5lbmQpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycyk7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGNvdW50ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnMucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0sIDApO1xuICAgICAgICAgICAgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIG5leHRTdGFydCk7XG4gICAgICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9PSAnKicpO1xuICAgICAgICByZXN1bHQucG9wKCk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGxhc3RTdGFydCwgbmV4dFN0YXJ0LCBjb3VudGVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pOiBzdHJpbmcge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENIQVJBQ1RFUl9FTkNPRElOR1MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChDSEFSQUNURVJfRU5DT0RJTkdTW2ldID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoQUxQSEFCRVRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShsYXN0U3RhcnQ6IG51bWJlciwgbmV4dFN0YXJ0OiBudW1iZXIsIGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuU2l6ZSA9IGNvdW50ZXJzLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLCAwKTtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gbmV4dFN0YXJ0IC0gbGFzdFN0YXJ0IC0gcGF0dGVyblNpemU7XG4gICAgICAgIHJldHVybiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kICogMykgPj0gcGF0dGVyblNpemU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZE5leHRXaWR0aChjb3VudGVyczogVWludDE2QXJyYXksIGN1cnJlbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBtaW5XaWR0aCA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldIDwgbWluV2lkdGggJiYgY291bnRlcnNbaV0gPiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGggPSBjb3VudGVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW5XaWR0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b1BhdHRlcm4oY291bnRlcnM6IFVpbnQxNkFycmF5KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGxldCBtYXhOYXJyb3dXaWR0aCA9IDA7XG4gICAgICAgIGxldCBudW1XaWRlQmFycyA9IG51bUNvdW50ZXJzO1xuICAgICAgICBsZXQgd2lkZUJhcldpZHRoID0gMDtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcblxuICAgICAgICB3aGlsZSAobnVtV2lkZUJhcnMgPiAzKSB7XG4gICAgICAgICAgICBtYXhOYXJyb3dXaWR0aCA9IHRoaXMuX2ZpbmROZXh0V2lkdGgoY291bnRlcnMsIG1heE5hcnJvd1dpZHRoKTtcbiAgICAgICAgICAgIG51bVdpZGVCYXJzID0gMDtcbiAgICAgICAgICAgIHBhdHRlcm4gPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldID4gbWF4TmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBpKTtcbiAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMrKztcbiAgICAgICAgICAgICAgICAgICAgd2lkZUJhcldpZHRoICs9IGNvdW50ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bVdpZGVCYXJzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVycyAmJiBudW1XaWRlQmFycyA+IDA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlcnNbaV0gPiBtYXhOYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnRlcnNbaV0gKiAyKSA+PSB3aWRlQmFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgcGF0dGVyblN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQxNkFycmF5KDkpO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlTXVzdFN0YXJ0OiBudW1iZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5tYXgoMCwgcGF0dGVyblN0YXJ0IC0gKChpIC0gcGF0dGVyblN0YXJ0KSAvIDQpKSB8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBhdHRlcm5TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzddID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls4XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBDb2RlMzlSZWFkZXIgfSBmcm9tICcuL2NvZGUtMzktcmVhZGVyJztcblxuZXhwb3J0IGNsYXNzIENvZGUzOVZJTlJlYWRlciBleHRlbmRzIENvZGUzOVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2NvZGVfMzlfdmluJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAYm9ycm93c1xuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS96eGluZy96eGluZy9ibG9iL21hc3Rlci9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS96eGluZy9jbGllbnQvcmVzdWx0L1ZJTlJlc3VsdFBhcnNlci5qYXZhXG4gICAgICovXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWNvZGUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGUgPSByZXN1bHQuY29kZTtcblxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvW0lPUV0vZywgJycpO1xuXG4gICAgICAgIGlmICghL1tBLVowLTldezE3fS8udGVzdChjb2RlKSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIEFaMDkgcGF0dGVybiBjb2RlOicsIGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrQ2hlY2tzdW0oY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrQ2hlY2tzdW0oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuICEhY29kZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXJjb2RlLCBCYXJjb2RlSW5mbywgQmFyY29kZVJlYWRlciB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuXG5jb25zdCBBTFBIQUJFVEhfU1RSSU5HID0gJzAxMjM0NTY3ODktJDovLitBQkNEJztcbmNvbnN0IEFMUEhBQkVUID0gWy4uLkFMUEhBQkVUSF9TVFJJTkddLm1hcChjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG4vLyBjb25zdCBBTFBIQUJFVCA9IFs0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDUsIDM2LCA1OCwgNDcsIDQ2LCA0MywgNjUsIDY2LCA2NywgNjhdO1xuY29uc3QgQ0hBUkFDVEVSX0VOQ09ESU5HUyA9IFsweDAwMywgMHgwMDYsIDB4MDA5LCAweDA2MCwgMHgwMTIsIDB4MDQyLCAweDAyMSwgMHgwMjQsIDB4MDMwLCAweDA0OCwgMHgwMGMsIDB4MDE4LCAweDA0NSxcbiAgICAweDA1MSwgMHgwNTQsIDB4MDE1LCAweDAxQSwgMHgwMjksIDB4MDBCLCAweDAwRV07XG5jb25zdCBTVEFSVF9FTkQgPSBbMHgwMUEsIDB4MDI5LCAweDAwQiwgMHgwMEVdO1xuY29uc3QgTUlOX0VOQ09ERURfQ0hBUlMgPSA0O1xuY29uc3QgTUFYX0FDQ0VQVEFCTEUgPSAyLjA7XG5jb25zdCBQQURESU5HID0gMS41O1xuXG5pbnRlcmZhY2UgVGhyZXNob2xkIHtcbiAgICBzcGFjZToge1xuICAgICAgICBuYXJyb3c6IHtcbiAgICAgICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgICAgIGNvdW50czogbnVtYmVyO1xuICAgICAgICAgICAgbWluOiBudW1iZXI7XG4gICAgICAgICAgICBtYXg6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgICAgd2lkZToge1xuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICAgICAgY291bnRzOiBudW1iZXI7XG4gICAgICAgICAgICBtaW46IG51bWJlcjtcbiAgICAgICAgICAgIG1heDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYmFyOiB7XG4gICAgICAgIG5hcnJvdzoge1xuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICAgICAgY291bnRzOiBudW1iZXI7XG4gICAgICAgICAgICBtaW46IG51bWJlcjtcbiAgICAgICAgICAgIG1heDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICB3aWRlOiB7XG4gICAgICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgICAgICBjb3VudHM6IG51bWJlcjtcbiAgICAgICAgICAgIG1pbjogbnVtYmVyO1xuICAgICAgICAgICAgbWF4OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvZGFiYXJSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBwcml2YXRlIF9jb3VudGVyczogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICdjb2RhYmFyJztcbiAgICAgICAgdGhpcy5fY291bnRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXJzID0gdGhpcy5fZmlsbENvdW50ZXJzKHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3cpLCB0aGlzLl9yb3cubGVuZ3RoLCAxKTtcblxuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIGxldCBuZXh0U3RhcnQgPSBzdGFydC5zdGFydENvdW50ZXI7XG4gICAgICAgIGxldCBwYXR0ZXJuOiBudW1iZXI7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihuZXh0U3RhcnQpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQ2hhciA9IHRoaXMuX3BhdHRlcm5Ub0NoYXIocGF0dGVybik7XG4gICAgICAgICAgICBpZiAoZGVjb2RlZENoYXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIG5leHRTdGFydCArPSA4O1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAxICYmIFNUQVJUX0VORC5zb21lKGNvZGUgPT4gY29kZSA9PT0gcGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobmV4dFN0YXJ0IDwgdGhpcy5fY291bnRlcnMubGVuZ3RoKTtcblxuICAgICAgICAvLyB2ZXJpZnkgZW5kXG4gICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCAtIDIpIDwgTUlOX0VOQ09ERURfQ0hBUlMgfHwgIVNUQVJUX0VORC5zb21lKGNvZGUgPT4gY29kZSA9PT0gcGF0dGVybikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmVyaWZ5IGVuZCB3aGl0ZSBzcGFjZVxuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVdoaXRlc3BhY2Uoc3RhcnQuc3RhcnRDb3VudGVyLCBuZXh0U3RhcnQgLSA4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgc3RhcnQuc3RhcnRDb3VudGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0U3RhcnQgPSBuZXh0U3RhcnQgPiB0aGlzLl9jb3VudGVycy5sZW5ndGggPyB0aGlzLl9jb3VudGVycy5sZW5ndGggOiBuZXh0U3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0LnN0YXJ0ICsgdGhpcy5fc3VtQ291bnRlcnMoc3RhcnQuc3RhcnRDb3VudGVyLCBuZXh0U3RhcnQgLSA4KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LnN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlXaGl0ZXNwYWNlKHN0YXJ0Q291bnRlcjogbnVtYmVyLCBlbmRDb3VudGVyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKChzdGFydENvdW50ZXIgLSAxIDw9IDApXG4gICAgICAgICAgICB8fCB0aGlzLl9jb3VudGVyc1tzdGFydENvdW50ZXIgLSAxXSA+PSAodGhpcy5fY2FsY3VsYXRlUGF0dGVybkxlbmd0aChzdGFydENvdW50ZXIpIC8gMi4wKSkge1xuICAgICAgICAgICAgaWYgKChlbmRDb3VudGVyICsgOCA+PSB0aGlzLl9jb3VudGVycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5fY291bnRlcnNbZW5kQ291bnRlciArIDddID49ICh0aGlzLl9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKGVuZENvdW50ZXIpIC8gMi4wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgob2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgb2Zmc2V0ICsgNzsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RocmVzaG9sZFJlc3VsdFBhdHRlcm4ocmVzdWx0OiBSZWFkb25seUFycmF5PHN0cmluZz4sIHN0YXJ0Q291bnRlcjogbnVtYmVyKTogVGhyZXNob2xkIHtcbiAgICAgICAgY29uc3QgY2F0ZWdvcml6YXRpb246IFRocmVzaG9sZCA9IHtcbiAgICAgICAgICAgIHNwYWNlOiB7XG4gICAgICAgICAgICAgICAgbmFycm93OiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJhcjoge1xuICAgICAgICAgICAgICAgIG5hcnJvdzogeyBzaXplOiAwLCBjb3VudHM6IDAsIG1pbjogMCwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFIH0sXG4gICAgICAgICAgICAgICAgd2lkZTogeyBzaXplOiAwLCBjb3VudHM6IDAsIG1pbjogMCwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHN0YXJ0Q291bnRlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSB0aGlzLl9jaGFyVG9QYXR0ZXJuKHJlc3VsdFtpXSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSA2OyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSAoaiAmIDEpID09PSAyID8gY2F0ZWdvcml6YXRpb24uYmFyIDogY2F0ZWdvcml6YXRpb24uc3BhY2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gKHBhdHRlcm4gJiAxKSA9PT0gMSA/IGtpbmQud2lkZSA6IGtpbmQubmFycm93O1xuICAgICAgICAgICAgICAgIGNhdC5zaXplICs9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGNhdC5jb3VudHMrKztcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID4+PSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICBbJ3NwYWNlJywgJ2JhciddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSBjYXRlZ29yaXphdGlvbltrZXldO1xuICAgICAgICAgICAga2luZC53aWRlLm1pbiA9IE1hdGguZmxvb3IoKGtpbmQubmFycm93LnNpemUgLyBraW5kLm5hcnJvdy5jb3VudHMgKyBraW5kLndpZGUuc2l6ZSAvIGtpbmQud2lkZS5jb3VudHMpIC8gMik7XG4gICAgICAgICAgICBraW5kLm5hcnJvdy5tYXggPSBNYXRoLmNlaWwoa2luZC53aWRlLm1pbik7XG4gICAgICAgICAgICBraW5kLndpZGUubWF4ID0gTWF0aC5jZWlsKChraW5kLndpZGUuc2l6ZSAqIE1BWF9BQ0NFUFRBQkxFICsgUEFERElORykgLyBraW5kLndpZGUuY291bnRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpemF0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoYXJUb1BhdHRlcm4oY2hhcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBTFBIQUJFVC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKEFMUEhBQkVUW2ldID09PSBjaGFyQ29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJfRU5DT0RJTkdTW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDB4MDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWxpZGF0ZVJlc3VsdChyZXN1bHQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgc3RhcnRDb3VudGVyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5fdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQsIHN0YXJ0Q291bnRlcik7XG4gICAgICAgIGxldCBwb3MgPSBzdGFydENvdW50ZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gdGhpcy5fY2hhclRvUGF0dGVybihyZXN1bHRbaV0pO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gNjsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gKGogJiAxKSA9PT0gMCA/IHRocmVzaG9sZC5iYXIgOiB0aHJlc2hvbGQuc3BhY2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gKHBhdHRlcm4gJiAxKSA9PT0gMSA/IGtpbmQud2lkZSA6IGtpbmQubmFycm93O1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLl9jb3VudGVyc1twb3MgKyBqXTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGNhdC5taW4gfHwgc2l6ZSA+IGNhdC5tYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXR0ZXJuID4+PSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm46IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIGxldCBtYXggPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHRoaXMuX2NvdW50ZXJzW2ldO1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSBjb3VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICBtaW4gPSBjb3VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgobWluICsgbWF4KSAvIDIuMCkgfCAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvUGF0dGVybihvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gNztcbiAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0ICsgbnVtQ291bnRlcnM7XG5cbiAgICAgICAgaWYgKGVuZCA+IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFyVGhyZXNob2xkID0gdGhpcy5fY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkKG9mZnNldCwgZW5kKTtcbiAgICAgICAgY29uc3Qgc3BhY2VUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0ICsgMSwgZW5kKTtcbiAgICAgICAgbGV0IGJpdG1hc2sgPSAxIDw8IChudW1Db3VudGVycyAtIDEpO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAoaSAmIDEpID09PSAwID8gYmFyVGhyZXNob2xkIDogc3BhY2VUaHJlc2hvbGQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlcnNbb2Zmc2V0ICsgaV0gPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIHw9IGJpdG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRtYXNrID4+PSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3VtQ291bnRlcnMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMuX2NvdW50ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3cpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY291bnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4oaSk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiAhPT0gLTEgJiYgU1RBUlRfRU5ELnNvbWUoY29kZSA9PiBjb2RlID09PSBwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IExvb2sgZm9yIHdoaXRlc3BhY2UgYWhlYWRcbiAgICAgICAgICAgICAgICBzdGFydCArPSB0aGlzLl9zdW1Db3VudGVycygwLCBpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMuX3N1bUNvdW50ZXJzKGksIGkgKyA4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgICAgICAgICBzdGFydENvdW50ZXI6IGksXG4gICAgICAgICAgICAgICAgICAgIGVuZENvdW50ZXI6IGkgKyA4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi4vY29tbW9uL21lcmdlJztcbmltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOID0gWzEsIDEsIDJdO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFszLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMiwgMV0sXG4gICAgWzIsIDEsIDIsIDJdLFxuICAgIFsxLCA0LCAxLCAxXSxcbiAgICBbMSwgMSwgMywgMl0sXG4gICAgWzEsIDIsIDMsIDFdLFxuICAgIFsxLCAxLCAxLCA0XSxcbiAgICBbMSwgMywgMSwgMl0sXG4gICAgWzEsIDIsIDEsIDNdLFxuICAgIFszLCAxLCAxLCAyXSxcbiAgICBbMSwgMSwgMiwgM10sXG4gICAgWzEsIDIsIDIsIDJdLFxuICAgIFsyLCAyLCAxLCAyXSxcbiAgICBbMSwgMSwgNCwgMV0sXG4gICAgWzIsIDMsIDEsIDFdLFxuICAgIFsxLCAzLCAyLCAxXSxcbiAgICBbNCwgMSwgMSwgMV0sXG4gICAgWzIsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAyLCAxXSxcbiAgICBbMiwgMSwgMSwgM11cbl07XG5jb25zdCBDT0RFX0ZSRVFVRU5DWSA9IFswLCAxMSwgMTMsIDE0LCAxOSwgMjUsIDI4LCAyMSwgMjIsIDI2XTtcblxuZXhwb3J0IGNsYXNzIEVBTlJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIGdldCBDT0RFX0xfU1RBUlQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZ2V0IENPREVfR19TVEFSVCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMTA7XG4gICAgfVxuXG4gICAgZ2V0IFNUQVJUX1BBVFRFUk4oKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBbMSwgMSwgMV07XG4gICAgfVxuXG4gICAgZ2V0IFNUT1BfUEFUVEVSTigpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIFsxLCAxLCAxXTtcbiAgICB9XG5cbiAgICBnZXQgTUlERExFX1BBVFRFUk4oKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBbMSwgMSwgMSwgMSwgMV07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29uZmlnPzogQmFyY29kZVJlYWRlckNvbmZpZywgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyPikge1xuICAgICAgICBzdXBlcihtZXJnZSh7XG4gICAgICAgICAgICBzdXBwbGVtZW50czogW10gLy8gQWxsb3dlZCBleHRlbnNpb25zIHRvIGJlIGRlY29kZWQgKDIgYW5kL29yIDUpXG4gICAgICAgIH0sIGNvbmZpZyksIHN1cHBsZW1lbnRzKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnZWFuXzEzJztcbiAgICAgICAgdGhpcy5fc2luZ2xlQ29kZUVycm9yID0gMC43MDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUNvZGVFcnJvciA9IDAuNDg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvZGVyYW5nZT86IG51bWJlcik6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaDogQmFyY29kZUluZm8gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBzdGFydFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkVSQUdFX0NPREVfRVJST1I7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IHRoaXMuX3Jvd1tvZmZzZXRdID8gMCA6IDE7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBpZiAoIWNvZGVyYW5nZSkge1xuICAgICAgICAgICAgY29kZXJhbmdlID0gQ09ERV9QQVRURVJOLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiBpc1doaXRlKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgY29kZXJhbmdlOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IgPiBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9IGlzV2hpdGUgPyAwIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbzogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKHRoaXMuU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCAwLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KTtcblxuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZUluZm8pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKGVuZEluZm8uZW5kIC0gZW5kSW5mby5zdGFydCk7XG5cbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHRoaXMuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQob2Zmc2V0OiBudW1iZXIsIGlzV2hpdGU6IDAgfCAxKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4odGhpcy5TVE9QX1BBVFRFUk4sIG9mZnNldCwgaXNXaGl0ZSwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBlbmRJbmZvICE9PSBudWxsID8gdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3k6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gQ09ERV9GUkVRVUVOQ1lbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoY29kZTogQmFyY29kZUluZm8sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbz4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMHgwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlLmVuZCk7XG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gdGhpcy5DT0RFX0dfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICBjb2RlLmNvZGUgLT0gdGhpcy5DT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg1IC0gaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMCA8PCAoNSAtIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29kZS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3REaWdpdCA9IHRoaXMuX2NhbGN1bGF0ZUZpcnN0RGlnaXQoY29kZUZyZXF1ZW5jeSk7XG5cbiAgICAgICAgaWYgKGZpcnN0RGlnaXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnVuc2hpZnQoZmlyc3REaWdpdCk7XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2ZpbmRQYXR0ZXJuKHRoaXMuTUlERExFX1BBVFRFUk4sIGNvZGUuZW5kLCAxLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCB0aGlzLkNPREVfR19TVEFSVCk7XG5cbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcbiAgICAgICAgbGV0IHJlc3VsdEluZm86IEJhcmNvZGUgPSB7fTtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGNvZGU6IHN0YXJ0SW5mby5jb2RlLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRJbmZvLmVuZFxuICAgICAgICB9O1xuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlUGF5bG9hZChjb2RlLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG5cbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUgPSB0aGlzLl9maW5kRW5kKGNvZGUuZW5kLCAwKTtcblxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgLy8gQ2hlY2tzdW1cbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja3N1bShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBsZW1lbnQgPSB0aGlzLl9kZWNvZGVFeHRlbnNpb25zKGNvZGUuZW5kKTtcbiAgICAgICAgICAgIGlmICghc3VwcGxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYXN0Q29kZSA9IHN1cHBsZW1lbnQuZGVjb2RlZENvZGVzW3N1cHBsZW1lbnQuZGVjb2RlZENvZGVzLmxlbmd0aCAtIDFdIGFzIEJhcmNvZGVJbmZvO1xuICAgICAgICAgICAgY29uc3QgZW5kSW5mbyA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogbGFzdENvZGUuc3RhcnQgKyAoKChsYXN0Q29kZS5lbmQgLSBsYXN0Q29kZS5zdGFydCkgLyAyKSB8IDApLFxuICAgICAgICAgICAgICAgIGVuZDogbGFzdENvZGUuZW5kXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRJbmZvID0ge1xuICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQsXG4gICAgICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpICsgc3VwcGxlbWVudC5jb2RlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvZGUuZW5kLFxuICAgICAgICAgICAgc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLFxuICAgICAgICAgICAgLi4ucmVzdWx0SW5mb1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RlY29kZUV4dGVuc2lvbnMob2Zmc2V0OiBudW1iZXIpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oRVhURU5TSU9OX1NUQVJUX1BBVFRFUk4sIHN0YXJ0LCAwLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3VwcGxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN1cHBsZW1lbnRzW2ldLmRlY29kZSh0aGlzLl9yb3csIHN0YXJ0SW5mby5lbmQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmZvLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHJlc3VsdC5lbmQsXG4gICAgICAgICAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LmRlY29kZWRDb2Rlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NoZWNrc3VtKHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gcmVzdWx0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VtICo9IDM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgICB9XG59IiwiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9jb21tb24vcG9pbnQnO1xuaW1wb3J0IHsgSW1hZ2VXcmFwcGVyIH0gZnJvbSAnLi4vY29tbW9uL2ltYWdlLXdyYXBwZXInO1xuXG5lbnVtIFNsb3BlIHtcbiAgICBVcCA9IDEsXG4gICAgRG93biA9IC0xXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhcmNvZGVMaW5lIHtcbiAgICBsaW5lOiBBcnJheTxudW1iZXI+O1xuICAgIG1heD86IG51bWJlcjtcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgdGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgQnJlc2VuaGFtID0ge1xuICAgIC8qKlxuICAgICAqIFNjYW5zIGEgbGluZSBvZiB0aGUgZ2l2ZW4gaW1hZ2UgZnJvbSBwb2ludCBwMSB0byBwMiBhbmQgcmV0dXJucyBhIHJlc3VsdCBvYmplY3QgY29udGFpbmluZ1xuICAgICAqIGdyYXktc2NhbGUgdmFsdWVzICgwLTI1NSkgb2YgdGhlIHVuZGVybHlpbmcgcGl4ZWxzIGluIGFkZGl0aW9uIHRvIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGltYWdlV3JhcHBlclxuICAgICAqIEBwYXJhbSBwMSBUaGUgc3RhcnQgcG9pbnQge3gseX1cbiAgICAgKiBAcGFyYW0gcDIgVGhlIGVuZCBwb2ludCB7eCx5fVxuICAgICAqIEByZXR1cm5zIHtsaW5lLCBtaW4sIG1heH1cbiAgICAgKi9cbiAgICBnZXRCYXJjb2RlTGluZShpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgcDE6IFBvaW50LCBwMjogUG9pbnQpOiBCYXJjb2RlTGluZSB7XG4gICAgICAgIGxldCB4MCA9IHAxLnggfCAwO1xuICAgICAgICBsZXQgeTAgPSBwMS55IHwgMDtcbiAgICAgICAgbGV0IHgxID0gcDIueCB8IDA7XG4gICAgICAgIGxldCB5MSA9IHAyLnkgfCAwO1xuICAgICAgICBjb25zdCBzdGVlcCA9IE1hdGguYWJzKHkxIC0geTApID4gTWF0aC5hYnMoeDEgLSB4MCk7XG4gICAgICAgIGxldCB0bXA6IG51bWJlcjtcbiAgICAgICAgY29uc3QgbGluZSA9IFtdO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgICAgICBsZXQgdmFsOiBudW1iZXI7XG4gICAgICAgIGxldCBtaW4gPSAyNTU7XG4gICAgICAgIGxldCBtYXggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlYWQoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHZhbCA9IGltYWdlRGF0YVtiICogd2lkdGggKyBhXTtcbiAgICAgICAgICAgIG1pbiA9IHZhbCA8IG1pbiA/IHZhbCA6IG1pbjtcbiAgICAgICAgICAgIG1heCA9IHZhbCA+IG1heCA/IHZhbCA6IG1heDtcbiAgICAgICAgICAgIGxpbmUucHVzaCh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0ZWVwKSB7XG4gICAgICAgICAgICB0bXAgPSB4MDtcbiAgICAgICAgICAgIHgwID0geTA7XG4gICAgICAgICAgICB5MCA9IHRtcDtcblxuICAgICAgICAgICAgdG1wID0geDE7XG4gICAgICAgICAgICB4MSA9IHkxO1xuICAgICAgICAgICAgeTEgPSB0bXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHgwID4geDEpIHtcbiAgICAgICAgICAgIHRtcCA9IHgwO1xuICAgICAgICAgICAgeDAgPSB4MTtcbiAgICAgICAgICAgIHgxID0gdG1wO1xuXG4gICAgICAgICAgICB0bXAgPSB5MDtcbiAgICAgICAgICAgIHkwID0geTE7XG4gICAgICAgICAgICB5MSA9IHRtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWx0YXggPSB4MSAtIHgwO1xuICAgICAgICBsZXQgZGVsdGF5ID0gTWF0aC5hYnMoeTEgLSB5MCk7XG4gICAgICAgIGxldCBlcnJvciA9IChkZWx0YXggLyAyKSB8IDA7XG4gICAgICAgIGxldCB5ID0geTA7XG4gICAgICAgIGxldCB5c3RlcCA9IHkwIDwgeTEgPyAxIDogLTE7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IHgwOyB4IDwgeDE7IHgrKykge1xuICAgICAgICAgICAgaWYgKHN0ZWVwKSB7XG4gICAgICAgICAgICAgICAgcmVhZCh5LCB4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVhZCh4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9yID0gZXJyb3IgLSBkZWx0YXk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPCAwKSB7XG4gICAgICAgICAgICAgICAgeSArPSB5c3RlcDtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yICsgZGVsdGF4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXhcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHJlc3VsdCBmcm9tIGdldEJhcmNvZGVMaW5lIGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAgICAgKiBhbHNvIGNvbnNpZGVyaW5nIHRoZSBmcmVxdWVuY3kgYW5kIHNsb3BlIG9mIHRoZSBzaWduYWwgZm9yIG1vcmUgcm9idXN0IHJlc3VsdHNcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHtsaW5lLCBtaW4sIG1heH1cbiAgICAgKi9cbiAgICB0b0JpbmFyeUxpbmUocmVzdWx0OiBCYXJjb2RlTGluZSk6IEJhcmNvZGVMaW5lIHtcbiAgICAgICAgY29uc3QgbWluID0gcmVzdWx0Lm1pbjtcbiAgICAgICAgY29uc3QgbWF4ID0gcmVzdWx0Lm1heDtcbiAgICAgICAgY29uc3QgbGluZSA9IHJlc3VsdC5saW5lO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBtaW4gKyAobWF4IC0gbWluKSAvIDI7XG4gICAgICAgIGNvbnN0IGV4dHJlbWEgPSBuZXcgQXJyYXk8eyBwb3M6IG51bWJlcjsgdmFsOiBudW1iZXI7IH0+KCk7XG4gICAgICAgIGxldCB0aHJlc2hvbGQgPSAobWF4IC0gbWluKSAvIDEyO1xuICAgICAgICBjb25zdCByVGhyZXNob2xkID0gLXRocmVzaG9sZDtcblxuICAgICAgICAvLyAxLiBmaW5kIGV4dHJlbWFcbiAgICAgICAgbGV0IGN1cnJlbnREaXIgPSBsaW5lWzBdID4gY2VudGVyID8gU2xvcGUuVXAgOiBTbG9wZS5Eb3duO1xuICAgICAgICBleHRyZW1hLnB1c2goe1xuICAgICAgICAgICAgcG9zOiAwLFxuICAgICAgICAgICAgdmFsOiBsaW5lWzBdXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzbG9wZSA9IChsaW5lW2kgKyAxXSAtIGxpbmVbaV0pO1xuICAgICAgICAgICAgY29uc3Qgc2xvcGUyID0gKGxpbmVbaSArIDJdIC0gbGluZVtpICsgMV0pO1xuICAgICAgICAgICAgbGV0IGRpcjogU2xvcGU7XG4gICAgICAgICAgICBpZiAoKHNsb3BlICsgc2xvcGUyKSA8IHJUaHJlc2hvbGQgJiYgbGluZVtpICsgMV0gPCAoY2VudGVyICogMS41KSkge1xuICAgICAgICAgICAgICAgIGRpciA9IFNsb3BlLkRvd247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChzbG9wZSArIHNsb3BlMikgPiB0aHJlc2hvbGQgJiYgbGluZVtpICsgMV0gPiAoY2VudGVyICogMC41KSkge1xuICAgICAgICAgICAgICAgIGRpciA9IFNsb3BlLlVwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXIgPSBjdXJyZW50RGlyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudERpciAhPT0gZGlyKSB7XG4gICAgICAgICAgICAgICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zOiBpLFxuICAgICAgICAgICAgICAgICAgICB2YWw6IGxpbmVbaV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGlyID0gZGlyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgICAgICBwb3M6IGxpbmUubGVuZ3RoLFxuICAgICAgICAgICAgdmFsOiBsaW5lW2xpbmUubGVuZ3RoIC0gMV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IGV4dHJlbWFbMF0ucG9zOyBqIDwgZXh0cmVtYVsxXS5wb3M7IGorKykge1xuICAgICAgICAgICAgbGluZVtqXSA9IGxpbmVbal0gPiBjZW50ZXIgPyAwIDogMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBleHRyZW1hIGFuZCBjb252ZXJ0IHRvIGJpbmFyeSBiYXNlZCBvbiBhdmcgYmV0d2VlbiBtaW5tYXhcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBleHRyZW1hLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKGV4dHJlbWFbaSArIDFdLnZhbCA+IGV4dHJlbWFbaV0udmFsKSB7XG4gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaV0udmFsICsgKChleHRyZW1hW2kgKyAxXS52YWwgLSBleHRyZW1hW2ldLnZhbCkgLyAzKSAqIDIpIHwgMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaSArIDFdLnZhbCArICgoZXh0cmVtYVtpXS52YWwgLSBleHRyZW1hW2kgKyAxXS52YWwpIC8gMykpIHwgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGV4dHJlbWFbaV0ucG9zOyBqIDwgZXh0cmVtYVtpICsgMV0ucG9zOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IHRocmVzaG9sZCA/IDAgOiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIHRocmVzaG9sZFxuICAgICAgICB9O1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyBCYXJjb2RlSW5mbywgQmFyY29kZVJlYWRlciwgQmFyY29kZVJlYWRlckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuaW1wb3J0IHsgRUFOUmVhZGVyIH0gZnJvbSAnLi9lYW4tcmVhZGVyJztcblxuZXhwb3J0IGNsYXNzIEVBTjhSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIoY29uZmlnLCBzdXBwbGVtZW50cyk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ2Vhbl84JztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoY29kZTogQmFyY29kZUluZm8sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbz4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlLmVuZCwgdGhpcy5DT0RFX0dfU1RBUlQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gdGhpcy5fZmluZFBhdHRlcm4odGhpcy5NSURETEVfUEFUVEVSTiwgY29kZS5lbmQsIDEsIGZhbHNlKTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIHRoaXMuQ09ERV9HX1NUQVJUKTtcblxuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29kZS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBFQU5SZWFkZXIgfSBmcm9tICcuL2Vhbi1yZWFkZXInO1xuXG5leHBvcnQgY2xhc3MgRUFOMlJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnPzogQmFyY29kZVJlYWRlckNvbmZpZywgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyPikge1xuICAgICAgICBzdXBlcihjb25maWcsIHN1cHBsZW1lbnRzKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnZWFuXzInO1xuICAgIH1cblxuICAgIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IG51bWJlcik6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCBlbmQgPSByb3cubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBjb25zdCBkZWNvZGVkQ29kZXMgPSBuZXcgQXJyYXk8QmFyY29kZUluZm8+KCk7XG4gICAgICAgIGxldCBvZmZzZXQgPSBzdGFydDtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAwO1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm87XG5cbiAgICAgICAgdGhpcy5fcm93ID0gcm93O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMiAmJiBvZmZzZXQgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgJSAxMCk7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICgxIC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSAyIHx8IChwYXJzZUludChyZXN1bHQuam9pbignJykpICUgNCkgIT09IGNvZGVGcmVxdWVuY3kpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmRcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXJjb2RlLCBCYXJjb2RlSW5mbywgQmFyY29kZVJlYWRlciwgQmFyY29kZVJlYWRlckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1yZWFkZXInO1xuaW1wb3J0IHsgRUFOUmVhZGVyIH0gZnJvbSAnLi9lYW4tcmVhZGVyJztcblxuZXhwb3J0IGNsYXNzIEVBTjVSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIGdldCBDSEVDS19ESUdJVF9FTkNPRElOR1MoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBbMjQsIDIwLCAxOCwgMTcsIDEyLCA2LCAzLCAxMCwgOSwgNV07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29uZmlnPzogQmFyY29kZVJlYWRlckNvbmZpZywgc3VwcGxlbWVudHM/OiBBcnJheTxCYXJjb2RlUmVhZGVyPikge1xuICAgICAgICBzdXBlcihjb25maWcsIHN1cHBsZW1lbnRzKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnZWFuXzUnO1xuICAgIH1cblxuICAgIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IG51bWJlcik6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCBlbmQgPSByb3cubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgICAgICBjb25zdCBkZWNvZGVkQ29kZXMgPSBuZXcgQXJyYXk8QmFyY29kZUluZm8+KCk7XG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm87XG5cbiAgICAgICAgdGhpcy5fcm93ID0gcm93O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNSAmJiBvZmZzZXQgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgJSAxMCk7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg0IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gNCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9leHRlbnNpb25DaGVja3N1bShyZXN1bHQpICE9PSB0aGlzLl9kZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3kpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IGNvZGUuZW5kXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lQ2hlY2tEaWdpdChjb2RlRnJlcXVlbmN5OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gdGhpcy5DSEVDS19ESUdJVF9FTkNPRElOR1NbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9leHRlbnNpb25DaGVja3N1bShyZXN1bHQ6IEFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICBsZXQgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHN1bSAqPSAzO1xuICAgICAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgICAgIH1cbiAgICAgICAgc3VtICo9IDM7XG5cbiAgICAgICAgcmV0dXJuIHN1bSAlIDEwO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcbmltcG9ydCB7IEVBTlJlYWRlciB9IGZyb20gJy4vZWFuLXJlYWRlcic7XG5cbmV4cG9ydCBjbGFzcyBVUENSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIoY29uZmlnLCBzdXBwbGVtZW50cyk7XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gJ3VwY19hJztcbiAgICB9XG5cbiAgICBkZWNvZGUoKTogQmFyY29kZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlY29kZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNvZGUgJiYgcmVzdWx0LmNvZGUubGVuZ3RoID09PSAxMyAmJiByZXN1bHQuY29kZS5jaGFyQXQoMCkgPT09ICcwJykge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSByZXN1bHQuY29kZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsImltcG9ydCB7IEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyLCBCYXJjb2RlUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBFQU5SZWFkZXIgfSBmcm9tICcuL2Vhbi1yZWFkZXInO1xuXG5jb25zdCBDT0RFX0ZSRVFVRU5DWSA9IFtbNTYsIDUyLCA1MCwgNDksIDQ0LCAzOCwgMzUsIDQyLCA0MSwgMzddLCBbNywgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl1dO1xuXG5leHBvcnQgY2xhc3MgVVBDRVJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgZ2V0IFNUT1BfUEFUVEVSTigpIHtcbiAgICAgICAgcmV0dXJuIFsxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3XTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc/OiBCYXJjb2RlUmVhZGVyQ29uZmlnLCBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXI+KSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3VwcGxlbWVudHMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICd1cGNfZSc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvZGU6IEJhcmNvZGVJbmZvLCByZXN1bHQ6IEFycmF5PG51bWJlcj4sIGRlY29kZWRDb2RlczogQXJyYXk8QmFyY29kZUluZm8+KTogQmFyY29kZUluZm8ge1xuICAgICAgICBsZXQgY29kZUZyZXF1ZW5jeSA9IDB4MDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IHRoaXMuQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZS5jb2RlID0gY29kZS5jb2RlIC0gdGhpcy5DT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg1IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5LCByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5OiBudW1iZXIsIHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBuclN5c3RlbSA9IDA7IG5yU3lzdGVtIDwgQ09ERV9GUkVRVUVOQ1kubGVuZ3RoOyBuclN5c3RlbSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZW25yU3lzdGVtXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDT0RFX0ZSRVFVRU5DWVtuclN5c3RlbV1baV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQobnJTeXN0ZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb252ZXJ0VG9VUENBKHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDJdO1xuICAgICAgICBsZXQgdXBjYSA9IFtyZXN1bHRbMF1dO1xuXG4gICAgICAgIGlmIChsYXN0RGlnaXQgPD0gMikge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCAzKSkuY29uY2F0KFtsYXN0RGlnaXQsIDAsIDAsIDAsIDBdKS5jb25jYXQocmVzdWx0LnNsaWNlKDMsIDYpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDMpIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNCkpLmNvbmNhdChbMCwgMCwgMCwgMCwgMF0pLmNvbmNhdChyZXN1bHQuc2xpY2UoNCwgNikpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNCkge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA1KSkuY29uY2F0KFswLCAwLCAwLCAwLCAwLCByZXN1bHRbNV1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNikpLmNvbmNhdChbMCwgMCwgMCwgMCwgbGFzdERpZ2l0XSk7XG4gICAgICAgIH1cblxuICAgICAgICB1cGNhLnB1c2gocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSk7XG4gICAgICAgIHJldHVybiB1cGNhO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5fY2hlY2tzdW0odGhpcy5fY29udmVydFRvVVBDQShyZXN1bHQpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQob2Zmc2V0OiBudW1iZXIsIGlzV2hpdGU6IDAgfCAxKSB7XG4gICAgICAgIGlzV2hpdGUgPSAxO1xuICAgICAgICByZXR1cm4gc3VwZXIuX2ZpbmRFbmQob2Zmc2V0LCBpc1doaXRlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvOiBCYXJjb2RlSW5mbyk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoZW5kSW5mby5lbmQgLSBlbmRJbmZvLnN0YXJ0KSAvIDI7XG5cbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHRoaXMuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuLi9jb21tb24vbWVyZ2UnO1xuaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcblxuY29uc3QgTiA9IDE7XG5jb25zdCBXID0gMztcbmNvbnN0IFNUQVJUX1BBVFRFUk4gPSBbTiwgTiwgTiwgTl07XG5jb25zdCBTVE9QX1BBVFRFUk4gPSBbTiwgTiwgV107XG5jb25zdCBDT0RFX1BBVFRFUk4gPSBbXG4gICAgW04sIE4sIFcsIFcsIE5dLFxuICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICBbTiwgVywgTiwgTiwgV10sXG4gICAgW1csIFcsIE4sIE4sIE5dLFxuICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICBbVywgTiwgVywgTiwgTl0sXG4gICAgW04sIFcsIFcsIE4sIE5dLFxuICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICBbVywgTiwgTiwgVywgTl0sXG4gICAgW04sIFcsIE4sIFcsIE5dXG5dO1xuY29uc3QgTUFYX0NPUlJFQ1RJT05fRkFDVE9SID0gNTtcblxuZXhwb3J0IGNsYXNzIEkyb2Y1UmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBfYmFyU3BhY2VSYXRpbzogW251bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcpIHtcbiAgICAgICAgc3VwZXIobWVyZ2Uoe1xuICAgICAgICAgICAgbm9ybWFsaXplQmFyU3BhY2VXaWR0aDogZmFsc2UgLy8gTm9ybWFsaXplIHRoZSB3aWR0aCBkaWZmZXJlbmNlIGJldHdlZW4gYmFycyBhbmQgc3BhY2VzXG4gICAgICAgIH0sIGNvbmZpZykpO1xuXG4gICAgICAgIHRoaXMuX2JhclNwYWNlUmF0aW8gPSBbMSwgMV07XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9ICdpMm9mNSc7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3NpbmdsZUNvZGVFcnJvciA9IDAuMzg7XG4gICAgICAgICAgICB0aGlzLl9hdmVyYWdlQ29kZUVycm9yID0gMC4wOTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NpbmdsZUNvZGVFcnJvciA9IDAuNzg7XG4gICAgICAgICAgICB0aGlzLl9hdmVyYWdlQ29kZUVycm9yID0gMC4zODtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRFbmQoKTtcblxuICAgICAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgMCk7XG5cbiAgICAgICAgaWYgKGNvdW50ZXJzLmxlbmd0aCAlIDEwICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG5cbiAgICAgICAgaWYgKCFjb2RlIHx8IHJlc3VsdC5sZW5ndGggJSAyICE9PSAwIHx8IHJlc3VsdC5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWF0Y2hQYXR0ZXJuKGNvdW50ZXI6IEFycmF5PG51bWJlcj4sIGNvZGU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPik6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudGVyU3VtOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgY29kZVN1bTogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3Rpb246IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0aW9uUmF0aW8gPSBNQVhfQ09SUkVDVElPTl9GQUNUT1I7XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0aW9uUmF0aW9JbnZlcnNlID0gMSAvIGNvcnJlY3Rpb25SYXRpbztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlclN1bVtpICUgMl0gKz0gY291bnRlcltpXTtcbiAgICAgICAgICAgICAgICBjb2RlU3VtW2kgJSAyXSArPSBjb2RlW2ldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3JyZWN0aW9uWzBdID0gY29kZVN1bVswXSAvIGNvdW50ZXJTdW1bMF07XG4gICAgICAgICAgICBjb3JyZWN0aW9uWzFdID0gY29kZVN1bVsxXSAvIGNvdW50ZXJTdW1bMV07XG5cbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMF0gPSBNYXRoLm1heChNYXRoLm1pbihjb3JyZWN0aW9uWzBdLCBjb3JyZWN0aW9uUmF0aW8pLCBjb3JyZWN0aW9uUmF0aW9JbnZlcnNlKTtcbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMV0gPSBNYXRoLm1heChNYXRoLm1pbihjb3JyZWN0aW9uWzFdLCBjb3JyZWN0aW9uUmF0aW8pLCBjb3JyZWN0aW9uUmF0aW9JbnZlcnNlKTtcbiAgICAgICAgICAgIHRoaXMuX2JhclNwYWNlUmF0aW8gPSBjb3JyZWN0aW9uO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2ldICo9IHRoaXMuX2JhclNwYWNlUmF0aW9baSAlIDJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9tYXRjaFBhdHRlcm4oY291bnRlciwgY29kZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKTogQmFyY29kZUluZm8ge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgc3RhcnRJbmZvOiBCYXJjb2RlSW5mbztcblxuICAgICAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd0JhcldpZHRoID0gKHN0YXJ0SW5mby5lbmQgLSBzdGFydEluZm8uc3RhcnQpID4+IDI7XG4gICAgICAgICAgICBjb25zdCBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gc3RhcnRJbmZvLnN0YXJ0IC0gbmFycm93QmFyV2lkdGggKiAxMDtcblxuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZUluZm8pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKGVuZEluZm8uZW5kIC0gZW5kSW5mby5zdGFydCkgLyAyO1xuXG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kRW5kKCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgdGhpcy5fcm93LnJldmVyc2UoKTtcblxuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RPUF9QQVRURVJOLCB1bmRlZmluZWQsIDAsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9yb3cucmV2ZXJzZSgpO1xuXG4gICAgICAgIGlmIChlbmRJbmZvID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldmVyc2UgbnVtYmVyc1xuICAgICAgICBjb25zdCBzdGFydCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHN0YXJ0O1xuXG4gICAgICAgIHJldHVybiBlbmRJbmZvICE9PSBudWxsID8gdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZUNvZGUoY291bnRlcjogQXJyYXk8bnVtYmVyPik6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBDT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNYXRjaC5lcnJvciA8IHRoaXMuQVZFUkFHRV9DT0RFX0VSUk9SID8gYmVzdE1hdGNoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoY291bnRlcnM6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVJbmZvPik6IFtCYXJjb2RlSW5mbywgQmFyY29kZUluZm9dIHtcbiAgICAgICAgY29uc3QgY291bnRlckxlbmd0aCA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY291bnRlcjAgPSBbMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IGNvdW50ZXIxID0gWzAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBsZXQgY29kZTA6IEJhcmNvZGVJbmZvO1xuICAgICAgICBsZXQgY29kZTE6IEJhcmNvZGVJbmZvO1xuICAgICAgICBsZXQgcG9zID0gMDtcblxuICAgICAgICB3aGlsZSAocG9zIDwgY291bnRlckxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyMFtpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLl9iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIxW2ldID0gY291bnRlcnNbcG9zICsgMV0gKiB0aGlzLl9iYXJTcGFjZVJhdGlvWzFdO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2RlMCA9IHRoaXMuX2RlY29kZUNvZGUoY291bnRlcjApO1xuICAgICAgICAgICAgaWYgKCFjb2RlMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2RlY29kZUNvZGUoY291bnRlcjEpO1xuICAgICAgICAgICAgaWYgKCFjb2RlMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlMC5jb2RlLCBjb2RlMS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUwLCBjb2RlMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2NvZGUwLCBjb2RlMV07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVSZWFkZXIsIEJhcmNvZGVSZWFkZXJDb25maWcgfSBmcm9tICcuL2JhcmNvZGUtcmVhZGVyJztcblxuY29uc3QgTiA9IDE7XG5jb25zdCBXID0gMztcbmNvbnN0IFNUQVJUX1BBVFRFUk4gPSBbVywgTiwgVywgTiwgTiwgTl07XG5jb25zdCBTVE9QX1BBVFRFUk4gPSBbVywgTiwgTiwgTiwgV107XG5jb25zdCBDT0RFX1BBVFRFUk4gPSBbXG4gICAgW04sIE4sIFcsIFcsIE5dLFxuICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICBbTiwgVywgTiwgTiwgV10sXG4gICAgW1csIFcsIE4sIE4sIE5dLFxuICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICBbVywgTiwgVywgTiwgTl0sXG4gICAgW04sIFcsIFcsIE4sIE5dLFxuICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICBbVywgTiwgTiwgVywgTl0sXG4gICAgW04sIFcsIE4sIFcsIE5dXG5dO1xuY29uc3Qgc3RhcnRQYXR0ZXJuTGVuZ3RoID0gU1RBUlRfUEFUVEVSTi5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyB2YWwsIDApO1xuXG5leHBvcnQgY2xhc3MgVHdvT2ZGaXZlUmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBfYmFyU3BhY2VSYXRpbzogW251bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICB0aGlzLl9iYXJTcGFjZVJhdGlvID0gWzEsIDFdO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnMm9mNSc7XG4gICAgICAgIHRoaXMuX3NpbmdsZUNvZGVFcnJvciA9IDAuNzg7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VDb2RlRXJyb3IgPSAwLjMwO1xuICAgIH1cblxuICAgIGRlY29kZSgpOiBCYXJjb2RlIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRFbmQoKTtcblxuICAgICAgICBpZiAoIWVuZEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoc3RhcnRJbmZvLmVuZCwgZW5kSW5mby5zdGFydCwgMCk7XG5cbiAgICAgICAgaWYgKGNvdW50ZXJzLmxlbmd0aCAlIDEwICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbz4oKTtcblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG5cbiAgICAgICAgaWYgKCFjb2RlIHx8IHJlc3VsdC5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgbGV0IG5hcnJvd0JhcldpZHRoID0gMTtcbiAgICAgICAgbGV0IHN0YXJ0SW5mbzogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUQVJUX1BBVFRFUk4sIG9mZnNldCwgMCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gKHN0YXJ0SW5mby5lbmQgLSBzdGFydEluZm8uc3RhcnQpIC8gc3RhcnRQYXR0ZXJuTGVuZ3RoIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDU7XG5cbiAgICAgICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0LCBzdGFydEluZm8uc3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8ge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMjtcblxuICAgICAgICBpZiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZCgpOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBjb25zdCBlbmRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RPUF9QQVRURVJOLCBvZmZzZXQsIDAsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kSW5mby5zdGFydDtcbiAgICAgICAgZW5kSW5mby5zdGFydCA9IHRoaXMuX3Jvdy5sZW5ndGggLSBlbmRJbmZvLmVuZDtcbiAgICAgICAgZW5kSW5mby5lbmQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gc3RhcnQ7XG5cbiAgICAgICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyB0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaDogQmFyY29kZUluZm8gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IENPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2guZXJyb3IgPCB0aGlzLkFWRVJBR0VfQ09ERV9FUlJPUiA/IGJlc3RNYXRjaCA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbz4pOiBCYXJjb2RlSW5mbyB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm87XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLl9iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb3VudGVyKTtcblxuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhcmNvZGUsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUmVhZGVyIH0gZnJvbSAnLi9iYXJjb2RlLXJlYWRlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gJC8rJWFiY2QqJztcbmNvbnN0IEFMUEhBQkVUID0gbmV3IFVpbnQxNkFycmF5KFsuLi5BTFBIQUJFVEhfU1RSSU5HXS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MTE0LCAweDE0OCwgMHgxNDQsIDB4MTQyLCAweDEyOCwgMHgxMjQsIDB4MTIyLCAweDE1MCwgMHgxMTIsIDB4MTBBLCAweDFBOCwgMHgxQTQsIDB4MUEyLCAweDE5NCwgMHgxOTIsIDB4MThBLFxuICAgIDB4MTY4LCAweDE2NCwgMHgxNjIsIDB4MTM0LCAweDExQSwgMHgxNTgsIDB4MTRDLCAweDE0NiwgMHgxMkMsIDB4MTE2LCAweDFCNCwgMHgxQjIsIDB4MUFDLCAweDFBNiwgMHgxOTYsIDB4MTlBLFxuICAgIDB4MTZDLCAweDE2NiwgMHgxMzYsIDB4MTNBLCAweDEyRSwgMHgxRDQsIDB4MUQyLCAweDFDQSwgMHgxNkUsIDB4MTc2LCAweDFBRSwgMHgxMjYsIDB4MURBLCAweDFENiwgMHgxMzIsIDB4MTVFXG5dKTtcbmNvbnN0IEFTVEVSSVNLID0gMHgxNUU7XG5cbmV4cG9ydCBjbGFzcyBDb2RlOTNSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSAnY29kZV85Myc7XG4gICAgfVxuXG4gICAgZGVjb2RlKCk6IEJhcmNvZGUge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheSg2KTtcbiAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmc7XG4gICAgICAgIGxldCBsYXN0U3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBzdGFydC5lbmQpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycyk7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGNvdW50ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnMucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0sIDApO1xuICAgICAgICAgICAgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIG5leHRTdGFydCk7XG4gICAgICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9PSAnKicpO1xuICAgICAgICByZXN1bHQucG9wKCk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5RW5kKGxhc3RTdGFydCwgbmV4dFN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeUNoZWNrc3VtcyhyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCByZXN1bHQubGVuZ3RoIC0gMik7XG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fZGVjb2RlRXh0ZW5kZWQocmVzdWx0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm46IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmVyaWZ5RW5kKGxhc3RTdGFydDogbnVtYmVyLCBuZXh0U3RhcnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobGFzdFN0YXJ0ID09PSBuZXh0U3RhcnQgfHwgIXRoaXMuX3Jvd1tuZXh0U3RhcnRdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9QYXR0ZXJuKGNvdW50ZXJzOiBVaW50MTZBcnJheSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gY291bnRlcnMubGVuZ3RoO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBNYXRoLnJvdW5kKGNvdW50ZXJzW2ldICogOSAvIHN1bSk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA8IDEgfHwgbm9ybWFsaXplZCA+IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgJiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsaXplZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAocGF0dGVybiA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIDw8PSBub3JtYWxpemVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZFN0YXJ0KCk6IEJhcmNvZGVJbmZvIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50MTZBcnJheSg2KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgcGF0dGVyblN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGxldCBpc1doaXRlOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlTXVzdFN0YXJ0OiBudW1iZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIGlzV2hpdGUpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5tYXgoMCwgcGF0dGVyblN0YXJ0IC0gKChpIC0gcGF0dGVyblN0YXJ0KSAvIDQpKSB8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBhdHRlcm5TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzRdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls1XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSBpc1doaXRlID8gMCA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbmRlZChjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gY2hhckFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGNoYXJBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChjaGFyID49ICdhJyAmJiBjaGFyIDw9ICdkJykge1xuICAgICAgICAgICAgICAgIGlmIChpID4gKGxlbmd0aCAtIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNoYXJBcnJheVsrK2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IG5leHRDaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSA2NCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ0YnICYmIG5leHRDaGFyIDw9ICdKJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdLJyAmJiBuZXh0Q2hhciA8PSAnTycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnUCcgJiYgbmV4dENoYXIgPD0gJ1MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDQzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ1QnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdPJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAzMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID09PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWRDaGFyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92ZXJpZnlDaGVja3N1bXMoY2hhckFycmF5OiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAyLCAyMClcbiAgICAgICAgICAgICYmIHRoaXMuX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCAtIDEsIDE1KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXk6IEFycmF5PHN0cmluZz4sIGluZGV4OiBudW1iZXIsIG1heFdlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFycmF5VG9DaGVjayA9IGNoYXJBcnJheS5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5VG9DaGVjay5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHdlaWdodGVkU3VtcyA9IGFycmF5VG9DaGVjay5yZWR1Y2UoKHN1bSwgY2hhciwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gKCgoaSAqIC0xKSArIChsZW5ndGggLSAxKSkgJSBtYXhXZWlnaHQpICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQUxQSEFCRVQuaW5kZXhPZihjaGFyLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgcmV0dXJuIHN1bSArICh3ZWlnaHQgKiB2YWx1ZSk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrQ2hhciA9IEFMUEhBQkVUWyh3ZWlnaHRlZFN1bXMgJSA0NyldO1xuICAgICAgICByZXR1cm4gY2hlY2tDaGFyID09PSBjaGFyQXJyYXlbaW5kZXhdLmNoYXJDb2RlQXQoMCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29kZTEyOFJlYWRlciB9IGZyb20gJy4vY29kZS0xMjgtcmVhZGVyJztcbmltcG9ydCB7IENvZGUzOVJlYWRlciB9IGZyb20gJy4vY29kZS0zOS1yZWFkZXInO1xuaW1wb3J0IHsgQ29kZTM5VklOUmVhZGVyIH0gZnJvbSAnLi9jb2RlLTM5LXZpbi1yZWFkZXInO1xuaW1wb3J0IHsgQ29kYWJhclJlYWRlciB9IGZyb20gJy4vY29kYWJhci1yZWFkZXInO1xuaW1wb3J0IHsgRUFOUmVhZGVyIH0gZnJvbSAnLi9lYW4tcmVhZGVyJztcbmltcG9ydCB7IEVBTjhSZWFkZXIgfSBmcm9tICcuL2Vhbi04LXJlYWRlcic7XG5pbXBvcnQgeyBFQU4yUmVhZGVyIH0gZnJvbSAnLi9lYW4tMi1yZWFkZXInO1xuaW1wb3J0IHsgRUFONVJlYWRlciB9IGZyb20gJy4vZWFuLTUtcmVhZGVyJztcbmltcG9ydCB7IFVQQ1JlYWRlciB9IGZyb20gJy4vdXBjLXJlYWRlcic7XG5pbXBvcnQgeyBVUENFUmVhZGVyIH0gZnJvbSAnLi91cGMtZS1yZWFkZXInO1xuaW1wb3J0IHsgSTJvZjVSZWFkZXIgfSBmcm9tICcuL2kyb2Y1LXJlYWRlcic7XG5pbXBvcnQgeyBUd29PZkZpdmVSZWFkZXIgfSBmcm9tICcuLzJvZjUtcmVhZGVyJztcbmltcG9ydCB7IENvZGU5M1JlYWRlciB9IGZyb20gJy4vY29kZS05My1yZWFkZXInO1xuXG5leHBvcnQgY29uc3QgUmVhZGVycyA9IHtcbiAgICBjb2RlXzEyOF9yZWFkZXI6IENvZGUxMjhSZWFkZXIsXG4gICAgZWFuX3JlYWRlcjogRUFOUmVhZGVyLFxuICAgIGVhbl81X3JlYWRlcjogRUFONVJlYWRlcixcbiAgICBlYW5fMl9yZWFkZXI6IEVBTjJSZWFkZXIsXG4gICAgZWFuXzhfcmVhZGVyOiBFQU44UmVhZGVyLFxuICAgIGNvZGVfMzlfcmVhZGVyOiBDb2RlMzlSZWFkZXIsXG4gICAgY29kZV8zOV92aW5fcmVhZGVyOiBDb2RlMzlWSU5SZWFkZXIsXG4gICAgY29kYWJhcl9yZWFkZXI6IENvZGFiYXJSZWFkZXIsXG4gICAgdXBjX3JlYWRlcjogVVBDUmVhZGVyLFxuICAgIHVwY19lX3JlYWRlcjogVVBDRVJlYWRlcixcbiAgICBpMm9mNV9yZWFkZXI6IEkyb2Y1UmVhZGVyLFxuICAgICcyb2Y1X3JlYWRlcic6IFR3b09mRml2ZVJlYWRlcixcbiAgICBjb2RlXzkzX3JlYWRlcjogQ29kZTkzUmVhZGVyXG59O1xuIiwiaW1wb3J0IHsgZ2V0VXNlck1lZGlhLCBlbnVtZXJhdGVEZXZpY2VzIH0gZnJvbSAnLi4vY29tbW9uL21lZGlhLWRldmljZXMnO1xuXG5sZXQgX3N0cmVhbTogTWVkaWFTdHJlYW07XG5cbmV4cG9ydCBjb25zdCBDYW1lcmFBY2Nlc3MgPSB7XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gYXR0YWNoIHRoZSBjYW1lcmEtc3RyZWFtIHRvIGEgZ2l2ZW4gdmlkZW8gZWxlbWVudFxuICAgICAqIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgY29udGVudCBpcyByZWFkeVxuICAgICAqIEBwYXJhbSB2aWRlb1xuICAgICAqIEBwYXJhbSB2aWRlb0NvbnN0cmFpbnRzXG4gICAgICovXG4gICAgYXN5bmMgcmVxdWVzdCh2aWRlbzogSFRNTFZpZGVvRWxlbWVudCwgdmlkZW9Db25zdHJhaW50czogTWVkaWFUcmFja0NvbnN0cmFpbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25zdHJhaW50cyA9IENhbWVyYUFjY2Vzcy5waWNrQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50cyk7XG4gICAgICAgIF9zdHJlYW0gPSBhd2FpdCBnZXRVc2VyTWVkaWEobm9ybWFsaXplZENvbnN0cmFpbnRzKTtcbiAgICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gX3N0cmVhbTtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICcnKTtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdtdXRlZCcsICcnKTtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgIHZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSkpLnRoZW4oX3dhaXRGb3JWaWRlby5iaW5kKG51bGwsIHZpZGVvKSk7XG4gICAgfSxcblxuICAgIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyYWNrcyA9IF9zdHJlYW0gJiYgX3N0cmVhbS5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyYWNrc1swXS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgX3N0cmVhbSA9IG51bGw7XG4gICAgfSxcblxuICAgIGFzeW5jIGVudW1lcmF0ZVZpZGVvRGV2aWNlcygpOiBQcm9taXNlPEFycmF5PE1lZGlhRGV2aWNlSW5mbz4+IHtcbiAgICAgICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IGVudW1lcmF0ZURldmljZXMoKTtcbiAgICAgICAgcmV0dXJuIGRldmljZXMuZmlsdGVyKCh7IGtpbmQgfSkgPT4ga2luZCA9PT0gJ3ZpZGVvaW5wdXQnKTtcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlU3RyZWFtTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBDYW1lcmFBY2Nlc3MuZ2V0QWN0aXZlVHJhY2soKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrID8gdHJhY2subGFiZWwgOiAnJztcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlVHJhY2soKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrcyA9IF9zdHJlYW0gJiYgX3N0cmVhbS5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFja3NbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgcGlja0NvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50cyk6IE1lZGlhU3RyZWFtQ29uc3RyYWludHMge1xuICAgICAgICBsZXQgeyB3aWR0aCwgaGVpZ2h0LCBmYWNpbmdNb2RlLCBhc3BlY3RSYXRpbywgZGV2aWNlSWQgfSA9IHZpZGVvQ29uc3RyYWludHM7XG4gICAgICAgIGNvbnN0IHsgbWluQXNwZWN0UmF0aW8sIGZhY2luZyB9ID0gdmlkZW9Db25zdHJhaW50cyBhcyBhbnk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtaW5Bc3BlY3RSYXRpbyAhPT0gJ3VuZGVmaW5lZCcgJiYgbWluQXNwZWN0UmF0aW8gPiAwKSB7XG4gICAgICAgICAgICBhc3BlY3RSYXRpbyA9IG1pbkFzcGVjdFJhdGlvO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFdBUk5JTkc6IENvbnN0cmFpbnQgJ21pbkFzcGVjdFJhdGlvJyBpcyBkZXByZWNhdGVkOyBVc2UgJ2FzcGVjdFJhdGlvJyBpbnN0ZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGZhY2luZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZhY2luZ01vZGUgPSBmYWNpbmc7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgV0FSTklORzogQ29uc3RyYWludCAnZmFjaW5nJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2ZhY2luZ01vZGUnIGluc3RlYWQnYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3JtYWxpemVkQ29uc3RyYWludHMgPSBkZXZpY2VJZCAmJiBmYWNpbmdNb2RlID9cbiAgICAgICAgICAgIHsgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8sIGRldmljZUlkIH0gOiB7IHdpZHRoLCBoZWlnaHQsIGZhY2luZ01vZGUsIGFzcGVjdFJhdGlvLCBkZXZpY2VJZCB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhdWRpbzogZmFsc2UsXG4gICAgICAgICAgICB2aWRlbzogbm9ybWFsaXplZENvbnN0cmFpbnRzXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfd2FpdEZvclZpZGVvKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDEwO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVmlkZW8oKSB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAxMCAmJiB2aWRlb0hlaWdodCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHt2aWRlb1dpZHRofXB4IHggJHt2aWRlb0hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChjaGVja1ZpZGVvLCA1MDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCdVbmFibGUgdG8gcGxheSB2aWRlbyBzdHJlYW0uIElzIHdlYmNhbSB3b3JraW5nPycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0ZW1wdHMtLTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja1ZpZGVvKCk7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBCb3ggfSBmcm9tICcuLi9jb21tb24vYm94JztcbmltcG9ydCB7IEltYWdlV3JhcHBlciB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS13cmFwcGVyJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IFJlYWRlcnMgfSBmcm9tICcuLi9yZWFkZXIvaW5kZXgnO1xuaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZVJlYWRlciwgQmFyY29kZVJlYWRlckNvbmZpZywgQmFyY29kZVJlYWRlckRlY2xhcmF0aW9uLCBCYXJjb2RlUmVhZGVyVHlwZSB9IGZyb20gJy4uL3JlYWRlci9iYXJjb2RlLXJlYWRlcic7XG5pbXBvcnQgeyBCYXJjb2RlTGluZSwgQnJlc2VuaGFtIH0gZnJvbSAnLi9icmVzZW5oYW0nO1xuaW1wb3J0IHsgSW1hZ2VEZWJ1ZyB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS1kZWJ1Zyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyY29kZURlY29kZXJDb25maWcge1xuICAgIGRlYnVnPzoge1xuICAgICAgICBkcmF3Qm91bmRpbmdCb3g/OiBib29sZWFuO1xuICAgICAgICBkcmF3U2NhbmxpbmU/OiBib29sZWFuO1xuICAgICAgICBzaG93RnJlcXVlbmN5PzogYm9vbGVhbjtcbiAgICAgICAgc2hvd1BhdHRlcm4/OiBib29sZWFuO1xuICAgIH07XG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAgIHJlYWRlcnM/OiBBcnJheTxCYXJjb2RlUmVhZGVyRGVjbGFyYXRpb24+O1xufVxuXG50eXBlIExpbmUgPSBbUG9pbnQsIFBvaW50XTtcblxuZXhwb3J0IGludGVyZmFjZSBRdWFnZ2FCYXJjb2RlIHtcbiAgICBhbmdsZT86IG51bWJlcjtcbiAgICBiYXJjb2Rlcz86IEFycmF5PFF1YWdnYUJhcmNvZGU+OyAvLyBUT09EOiBkZWFsIHdpdGggbXVsdGlwbGUgcmVzdWx0c1xuICAgIGJveD86IEJveDtcbiAgICBib3hlcz86IEFycmF5PEJveD47IC8vIFRPT0Q6IGRlYWwgd2l0aCBtdWx0aXBsZSByZXN1bHRzXG4gICAgY29kZVJlc3VsdD86IEJhcmNvZGU7XG4gICAgZnJhbWU/OiBzdHJpbmc7XG4gICAgbGluZT86IExpbmU7XG4gICAgcGF0dGVybj86IEFycmF5PG51bWJlcj47XG4gICAgdGhyZXNob2xkPzogbnVtYmVyO1xufTtcblxuaW50ZXJmYWNlIEJhcmNvZGVBbmRCYXJjb2RlTGluZSB7XG4gICAgY29kZVJlc3VsdDogQmFyY29kZTtcbiAgICBiYXJjb2RlTGluZTogQmFyY29kZUxpbmU7XG59XG5cbmV4cG9ydCBjbGFzcyBCYXJjb2RlRGVjb2RlciB7XG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCYXJjb2RlRGVjb2RlckNvbmZpZztcbiAgICBwcml2YXRlIF9pbnB1dEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyPFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUgX2ZyZXF1ZW5jeUNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfcGF0dGVybkNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICBwcml2YXRlIF9iYXJjb2RlUmVhZGVyczogQXJyYXk8QmFyY29kZVJlYWRlcj47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IEJhcmNvZGVEZWNvZGVyQ29uZmlnLCBpbnB1dEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyPFVpbnQ4QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIgPSBpbnB1dEltYWdlV3JhcHBlcjtcbiAgICAgICAgdGhpcy5fYmFyY29kZVJlYWRlcnMgPSBbXTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZGVidWdEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVidWcuZGV0ZWN0aW9uJyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5mcmVxdWVuY3knKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZnJlcXVlbmN5Q2FudmFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzLmNsYXNzTmFtZSA9ICdmcmVxdWVuY3knO1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0Rpdikge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Rpdi5hcHBlbmRDaGlsZCh0aGlzLl9mcmVxdWVuY3lDYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fY29uZmlnLmRlYnVnLnNob3dGcmVxdWVuY3kgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgICAgICAgICB0aGlzLl9wYXR0ZXJuQ2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzLnBhdHRlcm5CdWZmZXInKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcGF0dGVybkNhbnZhcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhdHRlcm5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXR0ZXJuQ2FudmFzLmNsYXNzTmFtZSA9ICdwYXR0ZXJuQnVmZmVyJztcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdEaXYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdEaXYuYXBwZW5kQ2hpbGQodGhpcy5fcGF0dGVybkNhbnZhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGF0dGVybkNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fY29uZmlnLmRlYnVnLnNob3dQYXR0ZXJuID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KCdjYW52YXMuZHJhd2luZ0J1ZmZlcicpO1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRleHQgPSBvdmVybGF5Q2FudmFzID8gb3ZlcmxheUNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRSZWFkZXJzKCk7XG4gICAgfVxuXG4gICAgZGVjb2RlRnJvbUJvdW5kaW5nQm94ZXMoYm94ZXM6IEFycmF5PEJveD4pOiBRdWFnZ2FCYXJjb2RlIHtcbiAgICAgICAgbGV0IGJhcmNvZGU6IFF1YWdnYUJhcmNvZGUgPSBudWxsO1xuXG4gICAgICAgIGlmIChib3hlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhcmNvZGVzID0gYm94ZXMubWFwKGJveCA9PiB0aGlzLmRlY29kZUZyb21Cb3VuZGluZ0JveChib3gpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBiYXJjb2RlcywgYm94ZXMgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChib3hlcy5zb21lKGJveCA9PiAhIShiYXJjb2RlID0gdGhpcy5kZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KSkpKSB7XG4gICAgICAgICAgICAgICAgYmFyY29kZS5ib3hlcyA9IGJveGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhcmNvZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2l0aCB0aGUgaGVscCBvZiB0aGUgY29uZmlndXJlZCByZWFkZXJzIHRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZGV0ZWN0XG4gICAgICogYSB2YWxpZCBiYXJjb2RlIHBhdHRlcm4gd2l0aGluIHRoZSBnaXZlbiBhcmVhLlxuICAgICAqIEBwYXJhbSBib3ggVGhlIGFyZWEgdG8gc2VhcmNoIGluXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCB7Y29kZVJlc3VsdCwgbGluZSwgYW5nbGUsIHBhdHRlcm4sIHRocmVzaG9sZH1cbiAgICAgKi9cbiAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94OiBCb3gpOiBRdWFnZ2FCYXJjb2RlIHtcbiAgICAgICAgY29uc3QgZGVidWcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX292ZXJsYXlDb250ZXh0ICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZztcblxuICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuZHJhd0JvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UGF0aChib3gsICdibHVlJywgMik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZSA9IHRoaXMuX2dldExpbmUoYm94KTtcblxuICAgICAgICBpZiAobGluZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIobGluZVsxXS55IC0gbGluZVswXS55LCBsaW5lWzFdLnggLSBsaW5lWzBdLngpO1xuICAgICAgICBsaW5lID0gdGhpcy5fZ2V0RXh0ZW5kZWRMaW5lKGxpbmUsIGFuZ2xlKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdHJ5RGVjb2RlKGxpbmUpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLl90cnlEZWNvZGVCcnV0ZUZvcmNlKGJveCwgbGluZSwgYW5nbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuZHJhd1NjYW5saW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UGF0aChsaW5lLCAncmVkJywgMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgICBib3gsXG4gICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQuY29kZVJlc3VsdCxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBwYXR0ZXJuOiByZXN1bHQuYmFyY29kZUxpbmUubGluZSxcbiAgICAgICAgICAgIHRocmVzaG9sZDogcmVzdWx0LmJhcmNvZGVMaW5lLnRocmVzaG9sZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldFJlYWRlcnMocmVhZGVyczogQXJyYXk8QmFyY29kZVJlYWRlckRlY2xhcmF0aW9uPik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb25maWcucmVhZGVycyA9IHJlYWRlcnM7XG4gICAgICAgIHRoaXMuX2JhcmNvZGVSZWFkZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2luaXRSZWFkZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFJlYWRlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5yZWFkZXJzLmZvckVhY2gocmVhZGVyQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGxldCByZWFkZXI6IEJhcmNvZGVSZWFkZXJUeXBlO1xuICAgICAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb246IEJhcmNvZGVSZWFkZXJDb25maWcgPSB7fTtcbiAgICAgICAgICAgIGxldCBzdXBwbGVtZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRlckNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkZXJDb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSByZWFkZXJDb25maWcuY29uZmlnIHx8IHt9O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNvbmZpZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQmVmb3JlIHJlZ2lzdGVyaW5nIHJlYWRlcjonLCByZWFkZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5zdXBwbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHN1cHBsZW1lbnRzID0gY29uZmlndXJhdGlvbi5zdXBwbGVtZW50cy5tYXAoc3VwcGxlbWVudCA9PiBuZXcgUmVhZGVyc1tzdXBwbGVtZW50XSgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fYmFyY29kZVJlYWRlcnMucHVzaChuZXcgUmVhZGVyc1tyZWFkZXJdKGNvbmZpZ3VyYXRpb24sIHN1cHBsZW1lbnRzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVnaXN0ZXJlZCBSZWFkZXJzOicsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fYmFyY29kZVJlYWRlcnMubWFwKCh7IGNvbmZpZywgRk9STUFUIH0pID0+IEpTT04uc3RyaW5naWZ5KHsgY29uZmlnLCBGT1JNQVQgfSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4dGVuZCB0aGUgbGluZSBvbiBib3RoIGVuZHNcbiAgICAgKiBAcGFyYW0gbGluZVxuICAgICAqIEBwYXJhbSBhbmdsZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEV4dGVuZGVkTGluZShsaW5lOiBMaW5lLCBhbmdsZTogbnVtYmVyKTogTGluZSB7XG4gICAgICAgIGZ1bmN0aW9uIGV4dGVuZExpbmUoYW1vdW50OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiBhbW91bnQgKiBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICAgICAgeDogYW1vdW50ICogTWF0aC5jb3MoYW5nbGUpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsaW5lWzBdLnkgLT0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICBsaW5lWzFdLnkgKz0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICBsaW5lWzFdLnggKz0gZXh0ZW5zaW9uLng7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gTWF0aC5zcXJ0KChsaW5lWzFdLnkgLSBsaW5lWzBdLnkpICoqIDIgKyAobGluZVsxXS54IC0gbGluZVswXS54KSAqKiAyKTtcbiAgICAgICAgbGV0IGV4dGVuc2lvbkxlbmd0aCA9IGxpbmVMZW5ndGggKiAwLjEgfCAwO1xuXG4gICAgICAgIGV4dGVuZExpbmUoZXh0ZW5zaW9uTGVuZ3RoKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBpbnNpZGUgaW1hZ2VcbiAgICAgICAgd2hpbGUgKGV4dGVuc2lvbkxlbmd0aCA+IDEgJiYgKCF0aGlzLl9pbnB1dEltYWdlV3JhcHBlci5pbkltYWdlV2l0aEJvcmRlcihsaW5lWzBdLCAwKVxuICAgICAgICAgICAgfHwgIXRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyLmluSW1hZ2VXaXRoQm9yZGVyKGxpbmVbMV0sIDApKSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uTGVuZ3RoID4+PSAxO1xuICAgICAgICAgICAgZXh0ZW5kTGluZSgtZXh0ZW5zaW9uTGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldExpbmUoYm94OiBCb3gpOiBMaW5lIHtcbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICB4OiAoYm94WzFdLnggKyBib3hbMF0ueCkgLyAyLFxuICAgICAgICAgICAgeTogKGJveFsxXS55ICsgYm94WzBdLnkpIC8gMlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiAoYm94WzNdLnggKyBib3hbMl0ueCkgLyAyLFxuICAgICAgICAgICAgeTogKGJveFszXS55ICsgYm94WzJdLnkpIC8gMlxuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90cnlEZWNvZGUobGluZTogTGluZSk6IEJhcmNvZGVBbmRCYXJjb2RlTGluZSB7XG4gICAgICAgIGNvbnN0IGRlYnVnID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWc7XG5cbiAgICAgICAgaWYgKGRlYnVnICYmIHRoaXMuX292ZXJsYXlDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UGF0aChsaW5lLCAncmVkJywgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmFyY29kZUxpbmUgPSBCcmVzZW5oYW0uZ2V0QmFyY29kZUxpbmUodGhpcy5faW5wdXRJbWFnZVdyYXBwZXIsIGxpbmVbMF0sIGxpbmVbMV0pO1xuXG4gICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5zaG93RnJlcXVlbmN5KSB7XG4gICAgICAgICAgICB0aGlzLl9wcmludEZyZXF1ZW5jeShiYXJjb2RlTGluZS5saW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhcmNvZGVMaW5lID0gQnJlc2VuaGFtLnRvQmluYXJ5TGluZShiYXJjb2RlTGluZSk7XG5cbiAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dQYXR0ZXJuKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmludFBhdHRlcm4oYmFyY29kZUxpbmUubGluZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29kZVJlc3VsdDogQmFyY29kZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fYmFyY29kZVJlYWRlcnMuc29tZShyZWFkZXIgPT4gISEoY29kZVJlc3VsdCA9IHJlYWRlci5kZWNvZGVQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUpKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvZGVSZXN1bHQgPyB7IGNvZGVSZXN1bHQsIGJhcmNvZGVMaW5lIH0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNsaWNlcyB0aGUgZ2l2ZW4gYXJlYSBhcGFydCBhbmQgdHJpZXMgdG8gZGV0ZWN0IGEgYmFyY29kZS1wYXR0ZXJuIGZvciBlYWNoIHNsaWNlLlxuICAgICAqIEl0IHJldHVybnMgdGhlIGRlY29kZWQgYmFyY29kZSwgb3IgbnVsbCBpZiBub3RoaW5nIHdhcyBmb3VuZFxuICAgICAqIEBwYXJhbSBib3hcbiAgICAgKiBAcGFyYW0gbGluZVxuICAgICAqIEBwYXJhbSBsaW5lQW5nbGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF90cnlEZWNvZGVCcnV0ZUZvcmNlKGJveDogQm94LCBsaW5lOiBMaW5lLCBsaW5lQW5nbGU6IG51bWJlcik6IEJhcmNvZGVBbmRCYXJjb2RlTGluZSB7XG4gICAgICAgIGNvbnN0IHNpZGVMZW5ndGggPSBNYXRoLnNxcnQoKGJveFsxXS54IC0gYm94WzBdLngpICoqIDIgKyAoYm94WzFdLnkgLSBib3hbMF0ueSkgKiogMik7XG4gICAgICAgIGNvbnN0IHNsaWNlcyA9IDE2O1xuICAgICAgICBjb25zdCB4ZGlyID0gTWF0aC5zaW4obGluZUFuZ2xlKTtcbiAgICAgICAgY29uc3QgeWRpciA9IE1hdGguY29zKGxpbmVBbmdsZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzbGljZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gbW92ZSBsaW5lIHBlcnBlbmRpY3VsYXIgdG8gYW5nbGVcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHNpZGVMZW5ndGggLyBzbGljZXMgKiBpICogKGkgJSAyID09PSAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGxpbmVbMF0ueSArPSBkaXIgKiB4ZGlyO1xuICAgICAgICAgICAgbGluZVswXS54IC09IGRpciAqIHlkaXI7XG4gICAgICAgICAgICBsaW5lWzFdLnkgKz0gZGlyICogeGRpcjtcbiAgICAgICAgICAgIGxpbmVbMV0ueCAtPSBkaXIgKiB5ZGlyO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl90cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGRldmVsb3BtZW50IG9ubHlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9wcmludEZyZXF1ZW5jeShsaW5lOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9mcmVxdWVuY3lDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy5fZnJlcXVlbmN5Q2FudmFzLndpZHRoID0gbGluZS5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNhbnZhcy5oZWlnaHQgPSAyNTY7XG5cbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdibHVlJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKGksIDI1NSk7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVUbyhpLCAyNTUgLSBsaW5lW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZGV2ZWxvcG1lbnQgb25seVxuICAgICAqL1xuICAgIHByaXZhdGUgX3ByaW50UGF0dGVybihsaW5lOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9wYXR0ZXJuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgdGhpcy5fcGF0dGVybkNhbnZhcy53aWR0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdibGFjayc7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGluZVtpXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoaSwgMCwgMSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RyYXdQYXRoKHBhdGg6IEFycmF5PFBvaW50PiwgY29sb3I6IHN0cmluZywgbGluZVdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChwYXRoLCB0aGlzLl9vdmVybGF5Q29udGV4dCwgY29sb3IsIGxpbmVXaWR0aCk7XG4gICAgfVxufVxuIiwiXG5leHBvcnQgZnVuY3Rpb24gZW51bWVyYXRlRGV2aWNlcygpOiBQcm9taXNlPEFycmF5PE1lZGlhRGV2aWNlSW5mbz4+IHtcbiAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJiB0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZW51bWVyYXRlRGV2aWNlcyBpcyBub3QgZGVmaW5lZCcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJNZWRpYShjb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8TWVkaWFTdHJlYW0+IHtcbiAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJiB0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZ2V0VXNlck1lZGlhIGlzIG5vdCBkZWZpbmVkJykpO1xufVxuIiwiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9jb21tb24vcG9pbnQnO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vaW5wdXQtc3RyZWFtLWNvbmZpZyc7XG5cbmNvbnN0IG5kYXJyYXkgPSByZXF1aXJlKCduZGFycmF5Jyk7XG50eXBlIG5kYXJyYXk8X1QgPSBudW1iZXI+ID0gYW55O1xuXG5leHBvcnQgY2xhc3MgRnJhbWVHcmFiYmVyIHtcbiAgICBwcml2YXRlIF9pbnB1dFN0cmVhbTogSW5wdXRTdHJlYW07XG4gICAgcHJpdmF0ZSBfc3RyZWFtQ29uZmlnOiBJbnB1dFN0cmVhbUNvbmZpZztcbiAgICBwcml2YXRlIF9kYXRhOiBVaW50OEFycmF5O1xuICAgIHByaXZhdGUgX2NhbnZhc0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgcHJpdmF0ZSBfZ3JheURhdGE6IFVpbnQ4QXJyYXk7XG4gICAgcHJpdmF0ZSBfY2FudmFzSW1hZ2VBcnJheTogbmRhcnJheTxudW1iZXI+O1xuICAgIHByaXZhdGUgX2dyYXlJbWFnZUFycmF5OiBuZGFycmF5PG51bWJlcj47XG4gICAgcHJpdmF0ZSBfdGFyZ2V0SW1hZ2VBcnJheTogbmRhcnJheTxudW1iZXI+O1xuICAgIHByaXZhdGUgX2NhbnZhc0hlaWdodDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2NhbnZhc1dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdmlkZW9IZWlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF92aWRlb1dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIF9zdGVwU2l6ZVg6IG51bWJlcjtcbiAgICBwcml2YXRlIF9zdGVwU2l6ZVk6IG51bWJlcjtcbiAgICBwcml2YXRlIF90b3BMZWZ0OiBQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSkge1xuICAgICAgICB0aGlzLl9pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtO1xuICAgICAgICB0aGlzLl9zdHJlYW1Db25maWcgPSBpbnB1dFN0cmVhbS5jb25maWc7XG4gICAgICAgIHRoaXMuX3ZpZGVvSGVpZ2h0ID0gaW5wdXRTdHJlYW0ucmVhbEhlaWdodDtcbiAgICAgICAgdGhpcy5fdmlkZW9XaWR0aCA9IGlucHV0U3RyZWFtLnJlYWxXaWR0aDtcbiAgICAgICAgdGhpcy5fY2FudmFzSGVpZ2h0ID0gaW5wdXRTdHJlYW0uY2FudmFzSGVpZ2h0O1xuICAgICAgICB0aGlzLl9jYW52YXNXaWR0aCA9IGlucHV0U3RyZWFtLmNhbnZhc1dpZHRoO1xuICAgICAgICB0aGlzLl93aWR0aCA9IGlucHV0U3RyZWFtLndpZHRoO1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSBpbnB1dFN0cmVhbS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuX3RvcExlZnQgPSBpbnB1dFN0cmVhbS50b3BMZWZ0O1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fd2lkdGggKiB0aGlzLl9oZWlnaHQpO1xuICAgICAgICB0aGlzLl9ncmF5RGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3ZpZGVvV2lkdGggKiB0aGlzLl92aWRlb0hlaWdodCk7XG4gICAgICAgIHRoaXMuX2NhbnZhc0RhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLl9jYW52YXNXaWR0aCAqIHRoaXMuX2NhbnZhc0hlaWdodCk7XG4gICAgICAgIHRoaXMuX2dyYXlJbWFnZUFycmF5ID0gbmRhcnJheSh0aGlzLl9ncmF5RGF0YSwgW3RoaXMuX3ZpZGVvSGVpZ2h0LCB0aGlzLl92aWRlb1dpZHRoXSkudHJhbnNwb3NlKDEsIDApO1xuICAgICAgICB0aGlzLl9jYW52YXNJbWFnZUFycmF5ID0gbmRhcnJheSh0aGlzLl9jYW52YXNEYXRhLCBbdGhpcy5fY2FudmFzSGVpZ2h0LCB0aGlzLl9jYW52YXNXaWR0aF0pLnRyYW5zcG9zZSgxLCAwKTtcbiAgICAgICAgdGhpcy5fdGFyZ2V0SW1hZ2VBcnJheSA9IHRoaXMuX2NhbnZhc0ltYWdlQXJyYXlcbiAgICAgICAgICAgIC5oaSh0aGlzLl90b3BMZWZ0LnggKyB0aGlzLl93aWR0aCwgdGhpcy5fdG9wTGVmdC55ICsgdGhpcy5faGVpZ2h0KS5sbyh0aGlzLl90b3BMZWZ0LngsIHRoaXMuX3RvcExlZnQueSk7XG4gICAgICAgIHRoaXMuX3N0ZXBTaXplWCA9IHRoaXMuX3ZpZGVvV2lkdGggLyB0aGlzLl9jYW52YXNXaWR0aDtcbiAgICAgICAgdGhpcy5fc3RlcFNpemVZID0gdGhpcy5fdmlkZW9IZWlnaHQgLyB0aGlzLl9jYW52YXNIZWlnaHQ7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0ZyYW1lR3JhYmJlcicsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHZpZGVvU2l6ZTogdGhpcy5fZ3JheUltYWdlQXJyYXkuc2hhcGUsXG4gICAgICAgICAgICBjYW52YXNTaXplOiB0aGlzLl9jYW52YXNJbWFnZUFycmF5LnNoYXBlLFxuICAgICAgICAgICAgc3RlcFNpemU6IFt0aGlzLl9zdGVwU2l6ZVgsIHRoaXMuX3N0ZXBTaXplWV0sXG4gICAgICAgICAgICBzaXplOiB0aGlzLl90YXJnZXRJbWFnZUFycmF5LnNoYXBlLFxuICAgICAgICAgICAgdG9wTGVmdDogdGhpcy5fdG9wTGVmdFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhIGZyYW1lIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcHV0cyBpbnRvIHRoZSBmcmFtZSBidWZmZXIuXG4gICAgICogVGhlIGltYWdlIGRhdGEgaXMgY29udmVydGVkIHRvIGdyYXkgc2NhbGUgYW5kIHRoZW4gaGFsZi1zYW1wbGVkIGlmIGNvbmZpZ3VyZWQuXG4gICAgICovXG4gICAgZ3JhYihkYXRhOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX2lucHV0U3RyZWFtLmdldEZyYW1lKCk7XG5cbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9zY2FsZUFuZENyb3AoZnJhbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zY2FsZUFuZENyb3AoZnJhbWU6IG5kYXJyYXk8bnVtYmVyPikge1xuICAgICAgICAvLyAxLiBjb21wdXRlIGZ1bGwtc2l6ZWQgZ3JheSBpbWFnZVxuICAgICAgICB0aGlzLl9jb21wdXRlR3JheShmcmFtZS5kYXRhKTtcblxuICAgICAgICAvLyAyLiBpbnRlcnBvbGF0ZVxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuX2NhbnZhc0hlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuX2NhbnZhc1dpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYW52YXNJbWFnZUFycmF5XG4gICAgICAgICAgICAgICAgICAgIC5zZXQoeCwgeSwgKGludGVycDJkKHRoaXMuX2dyYXlJbWFnZUFycmF5LCB4ICogdGhpcy5fc3RlcFNpemVYLCB5ICogdGhpcy5fc3RlcFNpemVZKSkgfCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRhcmdldEltYWdlQXJyYXkgbXVzdCBiZSBlcXVhbCB0byB0YXJnZXRTaXplXG4gICAgICAgIGlmICh0aGlzLl90YXJnZXRJbWFnZUFycmF5LnNoYXBlWzBdICE9PSB0aGlzLl93aWR0aCB8fCB0aGlzLl90YXJnZXRJbWFnZUFycmF5LnNoYXBlWzFdICE9PSB0aGlzLl9oZWlnaHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcGVzIGRvIG5vdCBtYXRjaCEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIGNyb3BcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLl9oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLl93aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YVt5ICogdGhpcy5fd2lkdGggKyB4XSA9IHRoaXMuX3RhcmdldEltYWdlQXJyYXkuZ2V0KHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29tcHV0ZUdyYXkoaW1hZ2VEYXRhOiBVaW50OENsYW1wZWRBcnJheSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZURhdGFMZW5ndGggPSBpbWFnZURhdGEubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0aGlzLl9zdHJlYW1Db25maWcgJiYgdGhpcy5fc3RyZWFtQ29uZmlnLnNpbmdsZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGltYWdlRGF0YUxlbmd0aDsgaSArPSA0LCBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhW2pdID0gaW1hZ2VEYXRhW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgaW1hZ2VEYXRhTGVuZ3RoOyBpICs9IDQsIGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFbal0gPSAwLjI5OSAqIGltYWdlRGF0YVtpXSArIDAuNTg3ICogaW1hZ2VEYXRhW2kgKyAxXSArIDAuMTE0ICogaW1hZ2VEYXRhW2kgKyAyXSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGJvcnJvd3MgaHR0cHM6Ly9naXRodWIuY29tL3NjaWpzL25kYXJyYXktbGluZWFyLWludGVycG9sYXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycDJkKGFycjogbmRhcnJheTxudW1iZXI+LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaXggPSBNYXRoLmZsb29yKHgpO1xuICAgIGNvbnN0IGZ4ID0geCAtIGl4O1xuICAgIGNvbnN0IHMwID0gMCA8PSBpeCAmJiBpeCA8IGFyci5zaGFwZVswXTtcbiAgICBjb25zdCBzMSA9IDAgPD0gaXggKyAxICYmIGl4ICsgMSA8IGFyci5zaGFwZVswXTtcbiAgICBjb25zdCBpeSA9IE1hdGguZmxvb3IoeSk7XG4gICAgY29uc3QgZnkgPSB5IC0gaXk7XG4gICAgY29uc3QgdDAgPSAwIDw9IGl5ICYmIGl5IDwgYXJyLnNoYXBlWzFdO1xuICAgIGNvbnN0IHQxID0gMCA8PSBpeSArIDEgJiYgaXkgKyAxIDwgYXJyLnNoYXBlWzFdO1xuICAgIGNvbnN0IHcwMCA9IHMwICYmIHQwID8gYXJyLmdldChpeCwgaXkpIDogMC4wO1xuICAgIGNvbnN0IHcwMSA9IHMwICYmIHQxID8gYXJyLmdldChpeCwgaXkgKyAxKSA6IDAuMDtcbiAgICBjb25zdCB3MTAgPSBzMSAmJiB0MCA/IGFyci5nZXQoaXggKyAxLCBpeSkgOiAwLjA7XG4gICAgY29uc3QgdzExID0gczEgJiYgdDEgPyBhcnIuZ2V0KGl4ICsgMSwgaXkgKyAxKSA6IDAuMDtcbiAgICByZXR1cm4gKDEuMCAtIGZ5KSAqICgoMS4wIC0gZngpICogdzAwICsgZnggKiB3MTApICsgZnkgKiAoKDEuMCAtIGZ4KSAqIHcwMSArIGZ4ICogdzExKTtcbn1cbiIsImltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IEltYWdlSW5mbyB9IGZyb20gJy4vaW1hZ2UtbG9hZGVyJztcbmltcG9ydCB7IElucHV0U3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0tY29uZmlnJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElucHV0U3RyZWFtIHtcbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZWRXaWR0aDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY2FudmFzSGVpZ2h0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9jYW52YXNXaWR0aDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfY29uZmlnOiBJbnB1dFN0cmVhbUNvbmZpZztcbiAgICBwcm90ZWN0ZWQgX2V2ZW50TmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgcHJvdGVjdGVkIF9ldmVudEhhbmRsZXJzOiBNYXA8c3RyaW5nLCBBcnJheTxFdmVudExpc3RlbmVyPj47XG4gICAgcHJvdGVjdGVkIF90b3BMZWZ0OiBQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9jYW52YXNXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PEV2ZW50TGlzdGVuZXI+PigpO1xuICAgICAgICB0aGlzLl90b3BMZWZ0ID0geyB4OiAwLCB5OiAwIH07XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IHJlYWxIZWlnaHQoKTogbnVtYmVyO1xuXG4gICAgYWJzdHJhY3QgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXI7XG5cbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgIH1cblxuICAgIHNldCBoZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlZEhlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZWRXaWR0aDtcbiAgICB9XG5cbiAgICBzZXQgd2lkdGgod2lkdGg6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9jYWxjdWxhdGVkV2lkdGggPSB3aWR0aDtcbiAgICB9XG5cbiAgICBnZXQgdG9wTGVmdCgpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcExlZnQgfTtcbiAgICB9XG5cbiAgICBzZXQgdG9wTGVmdCh0b3BMZWZ0OiBQb2ludCkge1xuICAgICAgICB0aGlzLl90b3BMZWZ0LnggPSB0b3BMZWZ0Lng7XG4gICAgICAgIHRoaXMuX3RvcExlZnQueSA9IHRvcExlZnQueTtcbiAgICB9XG5cbiAgICBzZXRDYW52YXNTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgY2FudmFzSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNIZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IGNhbnZhc1dpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNXaWR0aDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgY29uZmlnKCk6IElucHV0U3RyZWFtQ29uZmlnO1xuXG4gICAgYWJzdHJhY3Qgc2V0IGNvbmZpZyhjb25maWc6IElucHV0U3RyZWFtQ29uZmlnKTtcblxuICAgIGFic3RyYWN0IGdldCBlbmRlZCgpOiBib29sZWFuO1xuXG4gICAgYWJzdHJhY3Qgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBwYXVzZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgcGxheSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2V0IGN1cnJlbnRUaW1lKHRpbWU6IG51bWJlcik7XG5cbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLCBfb3B0aW9ucz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50SGFuZGxlcnMuaGFzKGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuc2V0KGV2ZW50LCBuZXcgQXJyYXk8RXZlbnRMaXN0ZW5lcj4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLmdldChldmVudCkucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdBcnJheT86IGFueSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50SGFuZGxlcnMuZ2V0KGV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4gaGFuZGxlci5hcHBseSh0aGlzLCBhcmdBcnJheSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0RnJhbWUoKTogSFRNTFZpZGVvRWxlbWVudCB8IEltYWdlSW5mbztcbn1cbiIsImltcG9ydCB7IEltYWdlSW5mbyB9IGZyb20gJy4vaW1hZ2UtbG9hZGVyJztcbmltcG9ydCB7IElucHV0U3RyZWFtIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0nO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW1Db25maWcgfSBmcm9tICcuL2lucHV0LXN0cmVhbS1jb25maWcnO1xuXG5jb25zdCBnZXRQaXhlbHMgPSByZXF1aXJlKCdnZXQtcGl4ZWxzJyk7XG5cbnR5cGUgbmRhcnJheTxfVCA9IG51bWJlcj4gPSBhbnk7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZVN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHtcbiAgICBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZW5kZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZnJhbWU6IG5kYXJyYXk8bnVtYmVyPjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfc2l6ZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9jYW52YXNIZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLl9jYW52YXNXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSAxO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fd2lkdGggPSAwO1xuICAgIH1cblxuICAgIGdldCByZWFsSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpZygpOiBJbnB1dFN0cmVhbUNvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgc2V0IGNvbmZpZyhjb25maWc6IElucHV0U3RyZWFtQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb25maWcuc3JjIHx8ICcnO1xuXG4gICAgICAgIHRoaXMuX2xvYWRJbWFnZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUoKSB7IH1cblxuICAgIHBhdXNlKCk6IHZvaWQgeyB9XG5cbiAgICBwbGF5KCk6IHZvaWQgeyB9XG5cbiAgICBzZXQgY3VycmVudFRpbWUoX3RpbWU6IG51bWJlcikgeyB9XG5cbiAgICBnZXRGcmFtZSgpOiBIVE1MVmlkZW9FbGVtZW50IHwgSW1hZ2VJbmZvIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbG9hZEltYWdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgZ2V0UGl4ZWxzKHRoaXMuX2Jhc2VVcmwsIHRoaXMuX2NvbmZpZy5taW1lLCAoZXJyOiBhbnksIHBpeGVsczogbmRhcnJheTxudW1iZXI+KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IHBpeGVscztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpeGVscy5zaGFwZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gcGl4ZWxzLnNoYXBlWzBdIHwgMDtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHBpeGVscy5zaGFwZVsxXSB8IDA7XG5cbiAgICAgICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gdGhpcy5fY2FsY3VsYXRlZFdpZHRoID0gdGhpcy5fY29uZmlnLnNpemUgPyB0aGlzLl93aWR0aCA+IHRoaXMuX2hlaWdodCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnNpemUgOiB0aGlzLl93aWR0aCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gdGhpcy5faGVpZ2h0IHwgMCA6IHRoaXMuX3dpZHRoO1xuICAgICAgICAgICAgdGhpcy5fY2FudmFzSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlZEhlaWdodCA9IHRoaXMuX2NvbmZpZy5zaXplID8gdGhpcy5fd2lkdGggPiB0aGlzLl9oZWlnaHQgP1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gdGhpcy5fd2lkdGggfCAwIDogdGhpcy5fY29uZmlnLnNpemUgOiB0aGlzLl9oZWlnaHQ7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyKCdjYW5yZWNvcmQnLCBbXSksIDApO1xuICAgICAgICB9LCB0aGlzLl9vZmZzZXQsIHRoaXMuX3NpemUsIHRoaXMuX2NvbmZpZy5zZXF1ZW5jZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW1hZ2VJbmZvIH0gZnJvbSAnLi9pbWFnZS1sb2FkZXInO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vaW5wdXQtc3RyZWFtLWNvbmZpZyc7XG5cbmV4cG9ydCBjbGFzcyBWaWRlb1N0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHtcbiAgICBwcml2YXRlIF92aWRlbzogSFRNTFZpZGVvRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fdmlkZW8gPSB2aWRlbztcbiAgICB9XG5cbiAgICBnZXQgcmVhbEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlYWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlkZW8udmlkZW9XaWR0aDtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCk6IElucHV0U3RyZWFtQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG5cbiAgICBzZXQgY29uZmlnKGNvbmZpZzogSW5wdXRTdHJlYW1Db25maWcpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgICAgICAgdGhpcy5fdmlkZW8uc3JjID0gY29uZmlnLnNyYyB8fCAnJztcbiAgICB9XG5cbiAgICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWRlby5lbmRlZDtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZGVvLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcGF1c2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZGVvLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcGxheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmlkZW8ucGxheSgpO1xuICAgIH1cblxuICAgIHNldCBjdXJyZW50VGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy50eXBlICE9PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvLmN1cnJlbnRUaW1lID0gdGltZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXIsIG9wdGlvbnM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5fZXZlbnROYW1lcy5pbmRleE9mKGV2ZW50KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETzogY29tZSB1cCB3aXRoIGEgd2F5IHRvIHJlbW92ZSB2aWRlbyBldmVudCBoYW5kbGVyc1xuICAgICAgICAvLyB0aGlzLl9ldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fZXZlbnRIYW5kbGVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgLy8gICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHRoaXMuX3ZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICBzdXBlci5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdBcnJheT86IGFueSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAnY2FucmVjb3JkJykge1xuICAgICAgICAgICAgdGhpcy5faW5pdFNpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLnRyaWdnZXIoZXZlbnROYW1lLCBhcmdBcnJheSlcbiAgICB9XG5cbiAgICBnZXRGcmFtZSgpOiBIVE1MVmlkZW9FbGVtZW50IHwgSW1hZ2VJbmZvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZGVvO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRTaXplKCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX3ZpZGVvLnZpZGVvV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuX3ZpZGVvLnZpZGVvSGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuX2NhbnZhc1dpZHRoID0gdGhpcy5fY2FsY3VsYXRlZFdpZHRoID1cbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zaXplID8gd2lkdGggPiBoZWlnaHQgPyB0aGlzLl9jb25maWcuc2l6ZSA6IHdpZHRoICogdGhpcy5fY29uZmlnLnNpemUgLyBoZWlnaHQgfCAwIDogd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhc0hlaWdodCA9IHRoaXMuX2NhbGN1bGF0ZWRIZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLnNpemUgPyB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCAqIHRoaXMuX2NvbmZpZy5zaXplIC8gd2lkdGggfCAwIDogdGhpcy5fY29uZmlnLnNpemUgOiBoZWlnaHQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGl2ZVN0cmVhbSBleHRlbmRzIFZpZGVvU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWRlbzogSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJycpO1xuICAgICAgICBzdXBlcih2aWRlbyk7XG4gICAgfVxuXG4gICAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgVmlkZW9TdHJlYW0gfSBmcm9tICcuL3ZpZGVvLXN0cmVhbSc7XG5cbmV4cG9ydCBjbGFzcyBMaXZlU3RyZWFtIGV4dGVuZHMgVmlkZW9TdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCAnJyk7XG4gICAgICAgIHN1cGVyKHZpZGVvKTtcbiAgICB9XG5cbiAgICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2NvbW1vbi9wb2ludCc7XG5pbXBvcnQgeyBCYXJjb2RlTG9jYXRvckNvbmZpZywgUGF0Y2hTaXplQ29uZmlnIH0gZnJvbSAnLi4vbG9jYXRvci9iYXJjb2RlLWxvY2F0b3ItY29uZmlnJztcbmltcG9ydCB7IElucHV0U3RyZWFtIH0gZnJvbSAnLi9pbnB1dC1zdHJlYW0nO1xuaW1wb3J0IHsgQXJlYUNvbmZpZyB9IGZyb20gJy4vaW5wdXQtc3RyZWFtLWNvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uIHtcbiAgICB1bml0OiAnJScgfCAncHgnLFxuICAgIHZhbHVlOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIF9jb21wdXRlRGl2aXNvcnMobjogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgY29uc3QgZGl2aXNvcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgIGNvbnN0IGxhcmdlRGl2aXNvcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgZm9yIChsZXQgZGl2aXNvciA9IDE7IGRpdmlzb3IgKiBkaXZpc29yIDw9IG47IGRpdmlzb3IrKykge1xuICAgICAgICBpZiAobiAlIGRpdmlzb3IgPT09IDApIHtcbiAgICAgICAgICAgIGRpdmlzb3JzLnB1c2goZGl2aXNvcik7XG4gICAgICAgICAgICBpZiAoZGl2aXNvciAqIGRpdmlzb3IgIT09IG4pIHtcbiAgICAgICAgICAgICAgICBsYXJnZURpdmlzb3JzLnVuc2hpZnQobiAvIGRpdmlzb3IgfCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaXZpc29ycy5jb25jYXQobGFyZ2VEaXZpc29ycyk7XG59XG5cbmZ1bmN0aW9uIF9jb21wdXRlQ29tbW9uRGl2aXNvcnMobTogbnVtYmVyLCBuOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICBpZiAobSA9PT0gbikge1xuICAgICAgICByZXR1cm4gX2NvbXB1dGVEaXZpc29ycyhtKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSBtID4gbiA/IG0gOiBuO1xuICAgIGNvbnN0IG1pbiA9IG0gPiBuID8gbiA6IG07XG4gICAgY29uc3QgZGl2aXNvcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgIGNvbnN0IGxhcmdlRGl2aXNvcnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgZm9yIChsZXQgZGl2aXNvciA9IDE7IGRpdmlzb3IgKiBkaXZpc29yIDw9IG1pbjsgZGl2aXNvcisrKSB7XG4gICAgICAgIGlmIChtYXggJSBkaXZpc29yID09PSAwICYmIG1pbiAlIGRpdmlzb3IgPT09IDApIHtcbiAgICAgICAgICAgIGRpdmlzb3JzLnB1c2goZGl2aXNvcik7XG4gICAgICAgICAgICBjb25zdCBsYXJnZURpdmlzb3IgPSBtaW4gLyBkaXZpc29yIHwgMDtcbiAgICAgICAgICAgIGlmIChkaXZpc29yICE9PSBsYXJnZURpdmlzb3IgJiYgbWF4ICUgbGFyZ2VEaXZpc29yID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGFyZ2VEaXZpc29ycy51bnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGl2aXNvcnMuY29uY2F0KGxhcmdlRGl2aXNvcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUGF0Y2hTaXplKHBhdGNoU2l6ZTogUGF0Y2hTaXplQ29uZmlnLCB7IHgsIHkgfTogUG9pbnQpOiBQb2ludCB7XG4gICAgY29uc3Qgd2lkZVNpZGUgPSBNYXRoLm1heCh4IHwgMCwgeSB8IDApIHwgMDtcbiAgICBjb25zdCBuck9mUGF0Y2hlc0xpc3QgPSBbOCwgMTAsIDE1LCAyMCwgMzIsIDYwLCA4MF07XG4gICAgY29uc3QgbnJPZlBhdGNoZXNNYXAgPSB7XG4gICAgICAgICd4LXNtYWxsJzogNSxcbiAgICAgICAgc21hbGw6IDQsXG4gICAgICAgIG1lZGl1bTogMyxcbiAgICAgICAgbGFyZ2U6IDIsXG4gICAgICAgICd4LWxhcmdlJzogMVxuICAgIH07XG4gICAgY29uc3QgbnJPZlBhdGNoZXNJbmRleCA9IG5yT2ZQYXRjaGVzTWFwW3BhdGNoU2l6ZV0gfHwgbnJPZlBhdGNoZXNNYXAubWVkaXVtIHwgMDtcbiAgICBjb25zdCBuck9mUGF0Y2hlcyA9IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0luZGV4XSB8IDA7XG4gICAgY29uc3QgZGVzaXJlZFBhdGNoU2l6ZSA9IHdpZGVTaWRlIC8gbnJPZlBhdGNoZXMgfCAwO1xuXG4gICAgZnVuY3Rpb24gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKGRpdmlzb3JzOiBBcnJheTxudW1iZXI+KTogUG9pbnQge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBmb3VuZCA9IGRpdmlzb3JzW2Rpdmlzb3JzLmxlbmd0aCA+PiAxXSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCAoZGl2aXNvcnMubGVuZ3RoIC0gMSkgJiYgZGl2aXNvcnNbaV0gPCBkZXNpcmVkUGF0Y2hTaXplKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZGl2aXNvcnNbaV0gLSBkZXNpcmVkUGF0Y2hTaXplKSA+IE1hdGguYWJzKGRpdmlzb3JzW2kgLSAxXSAtIGRlc2lyZWRQYXRjaFNpemUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBkaXZpc29yc1tpIC0gMV0gfCAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGRpdmlzb3JzW2ldIHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzaXJlZFBhdGNoU2l6ZSAvIGZvdW5kIDwgbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSW5kZXggKyAxXSAvIG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0luZGV4XSAmJlxuICAgICAgICAgICAgZGVzaXJlZFBhdGNoU2l6ZSAvIGZvdW5kID4gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSW5kZXggLSAxXSAvIG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0luZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogZm91bmQsIHk6IGZvdW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhfY29tcHV0ZUNvbW1vbkRpdmlzb3JzKHgsIHkpKSB8fFxuICAgICAgICBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoX2NvbXB1dGVEaXZpc29ycyh3aWRlU2lkZSkpIHx8XG4gICAgICAgIGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhfY29tcHV0ZURpdmlzb3JzKGRlc2lyZWRQYXRjaFNpemUgKiBuck9mUGF0Y2hlcykpO1xuXG4gICAgcmV0dXJuIG9wdGltYWxQYXRjaFNpemU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0ltYWdlQ29uc3RyYWludHMoaW5wdXRTdHJlYW06IElucHV0U3RyZWFtLCBjb25maWc6IEJhcmNvZGVMb2NhdG9yQ29uZmlnKSB7XG4gICAgbGV0IHdpZHRoID0gaW5wdXRTdHJlYW0ud2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IGlucHV0U3RyZWFtLmhlaWdodDtcbiAgICBjb25zdCBzaGlmdCA9IGNvbmZpZy5oYWxmU2FtcGxlID8gMSA6IDAgfCAwO1xuICAgIGNvbnN0IGlucHV0U3RyZWFtQ29uZmlnID0gaW5wdXRTdHJlYW0uY29uZmlnO1xuXG4gICAgLy8gY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQgYmFzZWQgb24gYXJlYVxuICAgIGlmIChpbnB1dFN0cmVhbUNvbmZpZyAmJiBpbnB1dFN0cmVhbUNvbmZpZy5hcmVhKSB7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBjb21wdXRlSW1hZ2VBcmVhKHdpZHRoLCBoZWlnaHQsIGlucHV0U3RyZWFtQ29uZmlnLmFyZWEpO1xuICAgICAgICBpbnB1dFN0cmVhbS50b3BMZWZ0ID0gYXJlYS50b3BMZWZ0O1xuICAgICAgICBpbnB1dFN0cmVhbS5zZXRDYW52YXNTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB3aWR0aCA9IGFyZWEud2lkdGg7XG4gICAgICAgIGhlaWdodCA9IGFyZWEuaGVpZ2h0O1xuICAgIH1cblxuICAgIGNvbnN0IHNpemUgPSB7XG4gICAgICAgIHg6IHdpZHRoID4+IHNoaWZ0LFxuICAgICAgICB5OiBoZWlnaHQgPj4gc2hpZnRcbiAgICB9O1xuXG4gICAgY29uc3QgcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKGNvbmZpZy5wYXRjaFNpemUsIHNpemUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQYXRjaC1TaXplOicsIEpTT04uc3RyaW5naWZ5KHBhdGNoU2l6ZSkpO1xuICAgIH1cblxuICAgIGlucHV0U3RyZWFtLndpZHRoID0gKHNpemUueCAvIHBhdGNoU2l6ZS54IDw8IHNoaWZ0KSAqIHBhdGNoU2l6ZS54IHwgMDtcbiAgICBpbnB1dFN0cmVhbS5oZWlnaHQgPSAoc2l6ZS55IC8gcGF0Y2hTaXplLnkgPDwgc2hpZnQpICogcGF0Y2hTaXplLnkgfCAwO1xuXG4gICAgaWYgKChpbnB1dFN0cmVhbS53aWR0aCAlIHBhdGNoU2l6ZS54KSA9PT0gMCAmJiAoaW5wdXRTdHJlYW0uaGVpZ2h0ICUgcGF0Y2hTaXplLnkpID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSBkaW1lbnNpb25zIGRvIG5vdCBjb21wbHkgd2l0aCB0aGUgY3VycmVudCBzZXR0aW5nczogd2lkdGggKCR7d2lkdGh9KSBhbmQgaGVpZ2h0ICgke2hlaWdodH0pIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke3BhdGNoU2l6ZS54fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3BhcnNlQ3NzRGltZW5zaW9uVmFsdWVzKHZhbHVlOiBzdHJpbmcpOiBEaW1lbnNpb24ge1xuICAgIGNvbnN0IGRpbWVuc2lvbjogRGltZW5zaW9uID0ge1xuICAgICAgICB2YWx1ZTogcGFyc2VGbG9hdCh2YWx1ZSksXG4gICAgICAgIHVuaXQ6IHZhbHVlLmluZGV4T2YoJyUnKSA9PT0gdmFsdWUubGVuZ3RoIC0gMSA/ICclJyA6IHZhbHVlLmluZGV4T2YoJ3B4JykgPT09IHZhbHVlLmxlbmd0aCAtIDIgPyAncHgnIDogJyUnXG4gICAgfTtcblxuICAgIHJldHVybiBkaW1lbnNpb247XG59XG5cbmV4cG9ydCBjb25zdCBfZGltZW5zaW9uc0NvbnZlcnRlcnMgPSB7XG4gICAgYm90dG9tOiAoZGltZW5zaW9uOiBEaW1lbnNpb24sIHsgaGVpZ2h0IH0pID0+IGRpbWVuc2lvbi51bml0ID09PSAnJScgP1xuICAgICAgICBoZWlnaHQgLSBoZWlnaHQgKiBkaW1lbnNpb24udmFsdWUgLyAxMDAgfCAwIDogZGltZW5zaW9uLnVuaXQgPT09ICdweCcgPyBoZWlnaHQgLSBkaW1lbnNpb24udmFsdWUgOiBoZWlnaHQsXG4gICAgbGVmdDogKGRpbWVuc2lvbjogRGltZW5zaW9uLCB7IHdpZHRoIH0pID0+IGRpbWVuc2lvbi51bml0ID09PSAnJScgP1xuICAgICAgICB3aWR0aCAqIGRpbWVuc2lvbi52YWx1ZSAvIDEwMCB8IDAgOiBkaW1lbnNpb24udW5pdCA9PT0gJ3B4JyA/IGRpbWVuc2lvbi52YWx1ZSA6IDAsXG4gICAgcmlnaHQ6IChkaW1lbnNpb246IERpbWVuc2lvbiwgeyB3aWR0aCB9KSA9PiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID9cbiAgICAgICAgd2lkdGggLSB3aWR0aCAqIGRpbWVuc2lvbi52YWx1ZSAvIDEwMCB8IDAgOiBkaW1lbnNpb24udW5pdCA9PT0gJ3B4JyA/IHdpZHRoIC0gZGltZW5zaW9uLnZhbHVlIDogd2lkdGgsXG4gICAgdG9wOiAoZGltZW5zaW9uOiBEaW1lbnNpb24sIHsgaGVpZ2h0IH0pOiBudW1iZXIgPT4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/XG4gICAgICAgIGhlaWdodCAqIGRpbWVuc2lvbi52YWx1ZSAvIDEwMCB8IDAgOiBkaW1lbnNpb24udW5pdCA9PT0gJ3B4JyA/IGRpbWVuc2lvbi52YWx1ZSA6IDBcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSW1hZ2VBcmVhKGlucHV0V2lkdGg6IG51bWJlciwgaW5wdXRIZWlnaHQ6IG51bWJlciwgYXJlYTogQXJlYUNvbmZpZykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHdpZHRoOiBpbnB1dFdpZHRoLCBoZWlnaHQ6IGlucHV0SGVpZ2h0IH07XG4gICAgY29uc3QgcGFyc2VkQXJlYToge1xuICAgICAgICBib3R0b20/OiBudW1iZXI7XG4gICAgICAgIGxlZnQ/OiBudW1iZXI7XG4gICAgICAgIHJpZ2h0PzogbnVtYmVyO1xuICAgICAgICB0b3A/OiBudW1iZXI7XG4gICAgfSA9IE9iamVjdC5rZXlzKGFyZWEpLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmVhW2tleV07XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IF9wYXJzZUNzc0RpbWVuc2lvblZhbHVlcyh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWQgPSBfZGltZW5zaW9uc0NvbnZlcnRlcnNba2V5XShwYXJzZWQsIGNvbnRleHQpO1xuXG4gICAgICAgIHJlc3VsdFtrZXldID0gY2FsY3VsYXRlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b3BMZWZ0OiB7IHg6IHBhcnNlZEFyZWEubGVmdCwgeTogcGFyc2VkQXJlYS50b3AgfSxcbiAgICAgICAgd2lkdGg6IHBhcnNlZEFyZWEucmlnaHQgLSBwYXJzZWRBcmVhLmxlZnQsXG4gICAgICAgIGhlaWdodDogcGFyc2VkQXJlYS5ib3R0b20gLSBwYXJzZWRBcmVhLnRvcFxuICAgIH07XG59XG4iLCJpbXBvcnQgeyBNb21lbnQgfSBmcm9tICcuL21vbWVudCc7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgY2x1c3RlciBmb3IgZ3JvdXBpbmcgc2ltaWxhciBvcmllbnRhdGlvbnMgb2YgbW9tZW50c1xuICovXG5leHBvcnQgY2xhc3MgQ2x1c3RlciB7XG4gICAgcHJpdmF0ZSBfdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbW9tZW50czogQXJyYXk8TW9tZW50PjtcbiAgICBwcml2YXRlIF9jZW50ZXI6IE1vbWVudDtcblxuICAgIHN0YXRpYyBjbHVzdGVyaXplKG1vbWVudHM6IEFycmF5PE1vbWVudD4sIHRocmVzaG9sZDogbnVtYmVyKTogQXJyYXk8Q2x1c3Rlcj4ge1xuICAgICAgICBjb25zdCBjbHVzdGVycyA9IG5ldyBBcnJheTxDbHVzdGVyPigpO1xuXG4gICAgICAgIG1vbWVudHMuZm9yRWFjaChtb21lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdDbHVzdGVyID0gY2x1c3RlcnMuZmluZChjbHVzdGVyID0+IGNsdXN0ZXIuZml0cyhtb21lbnQpKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nQ2x1c3Rlci5hZGQobW9tZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChuZXcgQ2x1c3Rlcih0aHJlc2hvbGQsIG1vbWVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2x1c3RlcnM7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IodGhyZXNob2xkOiBudW1iZXIsIG1vbWVudDogTW9tZW50KSB7XG4gICAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5fbW9tZW50cyA9IG5ldyBBcnJheTxNb21lbnQ+KCk7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IHtcbiAgICAgICAgICAgIHJhZDogMCxcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1vbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hZGQobW9tZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZChwb2ludDogTW9tZW50KSB7XG4gICAgICAgIHRoaXMuX21vbWVudHMucHVzaChwb2ludCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNlbnRlclxuICAgICAgICB0aGlzLl9jZW50ZXIucmFkID0gdGhpcy5fbW9tZW50cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5yYWQsIDApIC8gdGhpcy5fbW9tZW50cy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2NlbnRlci54ID0gTWF0aC5jb3ModGhpcy5fY2VudGVyLnJhZCk7XG4gICAgICAgIHRoaXMuX2NlbnRlci55ID0gTWF0aC5zaW4odGhpcy5fY2VudGVyLnJhZCk7XG4gICAgfVxuXG4gICAgZml0cyhtb21lbnQ6IE1vbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBjaGVjayBjb3NpbmUgc2ltaWxhcml0eSB0byBjZW50ZXItYW5nbGVcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IE1hdGguYWJzKG1vbWVudC54ICogdGhpcy5fY2VudGVyLnggKyBtb21lbnQueSAqIHRoaXMuX2NlbnRlci55KTtcbiAgICAgICAgcmV0dXJuIHNpbWlsYXJpdHkgPiB0aGlzLl90aHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgZ2V0IG1vbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb21lbnRzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEltYWdlV3JhcHBlciB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS13cmFwcGVyJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcblxuLyoqXG4gKiBJbnZlcnQgbWF0cml4XG4gKiBAcGFyYW0gbWF0cml4IHRoZSBtYXRyaXggdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB0aGUgaW52ZXJ0ZWQgbWF0cml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQobWF0cml4OiBGbG9hdDMyQXJyYXkpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IGEwID0gbWF0cml4WzBdO1xuICAgIGNvbnN0IGExID0gbWF0cml4WzFdO1xuICAgIGNvbnN0IGEyID0gbWF0cml4WzJdO1xuICAgIGNvbnN0IGEzID0gbWF0cml4WzNdO1xuICAgIGNvbnN0IGRldGVybWluYW50ID0gYTAgKiBhMyAtIGEyICogYTE7XG5cbiAgICBpZiAoIWRldGVybWluYW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFthMyAvIGRldGVybWluYW50LCAtYTEgLyBkZXRlcm1pbmFudCwgLWEyIC8gZGV0ZXJtaW5hbnQsIGEwIC8gZGV0ZXJtaW5hbnRdKTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWN0b3Igd2l0aCBhIG1hdHJpeFxuICogQHBhcmFtIHsgeCwgeSB9IHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSBtYXRyaXggbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB0aGUgdHJhbnNmb3JtZWQgdmVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1XaXRoTWF0cml4KHsgeCwgeSB9OiBQb2ludCwgbWF0cml4OiBGbG9hdDMyQXJyYXkpOiBQb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbWF0cml4WzBdICogeCArIG1hdHJpeFsyXSAqIHksXG4gICAgICAgIHk6IG1hdHJpeFsxXSAqIHggKyBtYXRyaXhbM10gKiB5XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gX2NvbXB1dGVIaXN0b2dyYW0oaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbDogbnVtYmVyKTogSW50MzJBcnJheSB7XG4gICAgaWYgKCFiaXRzUGVyUGl4ZWwpIHtcbiAgICAgICAgYml0c1BlclBpeGVsID0gODtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBiaXRTaGlmdCA9IDggLSBiaXRzUGVyUGl4ZWw7XG4gICAgY29uc3QgYnVja2V0Q291bnQgPSAxIDw8IGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBoaXN0b2dyYW0gPSBuZXcgSW50MzJBcnJheShidWNrZXRDb3VudCk7XG5cbiAgICBmb3IgKGxldCBpID0gaW1hZ2VEYXRhLmxlbmd0aDsgaS0tOykge1xuICAgICAgICBoaXN0b2dyYW1baW1hZ2VEYXRhW2ldID4+IGJpdFNoaWZ0XSsrO1xuICAgIH1cblxuICAgIHJldHVybiBoaXN0b2dyYW07XG59XG5cbmZ1bmN0aW9uIF9kZXRlcm1pbmVPdHN1VGhyZXNob2xkKGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyLCBiaXRzUGVyUGl4ZWw/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghYml0c1BlclBpeGVsKSB7XG4gICAgICAgIGJpdHNQZXJQaXhlbCA9IDg7XG4gICAgfVxuXG4gICAgY29uc3QgYml0U2hpZnQgPSA4IC0gYml0c1BlclBpeGVsO1xuICAgIGNvbnN0IGhpc3QgPSBfY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCk7XG4gICAgY29uc3QgdmV0ID0gWzBdO1xuICAgIGNvbnN0IG1heCA9ICgxIDw8IGJpdHNQZXJQaXhlbCkgLSAxO1xuXG4gICAgZnVuY3Rpb24gcHgoaW5pdDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBpbml0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaGlzdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbXgoaW5pdDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBpbml0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaSAqIGhpc3RbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAxOyBrIDwgbWF4OyBrKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSBweCgwLCBrKTtcbiAgICAgICAgY29uc3QgcDIgPSBweChrICsgMSwgbWF4KTtcbiAgICAgICAgY29uc3QgcDEyID0gcDEgKiBwMiB8fCAxO1xuICAgICAgICBjb25zdCBtMSA9IG14KDAsIGspICogcDI7XG4gICAgICAgIGNvbnN0IG0yID0gbXgoayArIDEsIG1heCkgKiBwMTtcbiAgICAgICAgY29uc3QgbTEyID0gbTEgLSBtMjtcbiAgICAgICAgdmV0W2tdID0gbTEyICogbTEyIC8gcDEyO1xuICAgIH1cblxuICAgIC8vIGluZGV4IG9mIG1heCBlbGVtZW50XG4gICAgY29uc3QgdGhyZXNob2xkID0gdmV0LnJlZHVjZSgobWF4SW5kZXgsIGl0ZW0sIGluZGV4LCBhcnJheSkgPT4gaXRlbSA+IGFycmF5W21heEluZGV4XSA/IGluZGV4IDogbWF4SW5kZXgsIDApO1xuXG4gICAgcmV0dXJuIHRocmVzaG9sZCA8PCBiaXRTaGlmdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG90c3VUaHJlc2hvbGQoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIHRhcmdldFdyYXBwZXI6IEltYWdlV3JhcHBlcik6IG51bWJlciB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gX2RldGVybWluZU90c3VUaHJlc2hvbGQoaW1hZ2VXcmFwcGVyKTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gdGFyZ2V0V3JhcHBlci5kYXRhO1xuXG4gICAgaW1hZ2VXcmFwcGVyLmRhdGEuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHRhcmdldERhdGFbaW5kZXhdID0gdmFsdWUgPCB0aHJlc2hvbGQgPyAxIDogMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aHJlc2hvbGQ7XG59XG5cbi8qKlxuICogQHBhcmFtIGltYWdlV3JhcHBlciBpbnB1dCBpbWFnZSB0byBiZSBzYW1wbGVkXG4gKiBAcGFyYW0gb3V0SW1hZ2VXcmFwcGVyIHtJbWFnZVdyYXBwZXJ9IHRvIGJlIHN0b3JlZCBpblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFsZlNhbXBsZShpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgb3V0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbWFnZSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBvdXRJbWFnZSA9IG91dEltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gaW1hZ2UubGVuZ3RoO1xuICAgIGNvbnN0IG91dFdpZHRoID0gd2lkdGggPj4gMTtcbiAgICBsZXQgdG9wUm93SW5kZXggPSAwO1xuICAgIGxldCBib3R0b21Sb3dJbmRleCA9IHdpZHRoO1xuICAgIGxldCBvdXRJbWdJbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoYm90dG9tUm93SW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIG91dEltYWdlW291dEltZ0luZGV4XSA9XG4gICAgICAgICAgICAgICAgKGltYWdlW3RvcFJvd0luZGV4XSArIGltYWdlW3RvcFJvd0luZGV4ICsgMV0gKyBpbWFnZVtib3R0b21Sb3dJbmRleF0gKyBpbWFnZVtib3R0b21Sb3dJbmRleCArIDFdKSA+PiAyO1xuICAgICAgICAgICAgb3V0SW1nSW5kZXgrKztcbiAgICAgICAgICAgIHRvcFJvd0luZGV4ICs9IDI7XG4gICAgICAgICAgICBib3R0b21Sb3dJbmRleCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIHRvcFJvd0luZGV4ICs9IHdpZHRoO1xuICAgICAgICBib3R0b21Sb3dJbmRleCArPSB3aWR0aDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL2ltYWdlLXdyYXBwZXJcIjtcblxuLyoqXG4gKiBAYm9ycm93cyBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9UaXBzLzQwNzE3Mi9Db25uZWN0ZWQtQ29tcG9uZW50LUxhYmVsaW5nLWFuZC1WZWN0b3JpemF0aW9uXG4gKi9cblxudHlwZSBEaXJlY3Rpb24gPSBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBTZWFyY2hEaXJlY3Rpb25zOiBBcnJheTxBcnJheTxEaXJlY3Rpb24+PiA9IFtbMCwgMV0sIFsxLCAxXSwgWzEsIDBdLCBbMSwgLTFdLCBbMCwgLTFdLCBbLTEsIC0xXSwgWy0xLCAwXSwgWy0xLCAxXV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udG91clZlcnRleCB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBkaXI6IERpcmVjdGlvbixcbiAgICBuZXh0OiBDb250b3VyVmVydGV4LFxuICAgIHByZXY6IENvbnRvdXJWZXJ0ZXhcbn1cblxuaW50ZXJmYWNlIEN1cnJlbnQge1xuICAgIGN4OiBudW1iZXIsXG4gICAgY3k6IG51bWJlcixcbiAgICBkaXI6IERpcmVjdGlvblxufVxuXG5leHBvcnQgY2xhc3MgVHJhY2VyIHtcbiAgICBwcml2YXRlIF9pbWFnZURhdGE6IFVpbnQ4QXJyYXk7XG4gICAgcHJpdmF0ZSBfbGFiZWxEYXRhOiBBcnJheTxudW1iZXI+O1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyOiBJbWFnZVdyYXBwZXI8QXJyYXk8bnVtYmVyPj4pIHtcbiAgICAgICAgdGhpcy5faW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgICAgIHRoaXMuX2xhYmVsRGF0YSA9IGxhYmVsV3JhcHBlci5kYXRhIGFzIEFycmF5PG51bWJlcj47XG4gICAgICAgIHRoaXMuX3dpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICB9XG5cbiAgICB0cmFjZShjdXJyZW50OiBDdXJyZW50LCBjb2xvcjogbnVtYmVyLCBsYWJlbDogbnVtYmVyLCBlZGdlTGFiZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgeSA9IGN1cnJlbnQuY3kgKyBTZWFyY2hEaXJlY3Rpb25zW2N1cnJlbnQuZGlyXVswXSB8IDA7XG4gICAgICAgICAgICBjb25zdCB4ID0gY3VycmVudC5jeCArIFNlYXJjaERpcmVjdGlvbnNbY3VycmVudC5kaXJdWzFdIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHkgKiB0aGlzLl93aWR0aCArIHggfCAwO1xuXG4gICAgICAgICAgICBpZiAoKHRoaXMuX2ltYWdlRGF0YVtwb3NdID09PSBjb2xvcikgJiYgKCh0aGlzLl9sYWJlbERhdGFbcG9zXSA9PT0gMCkgfHwgKHRoaXMuX2xhYmVsRGF0YVtwb3NdID09PSBsYWJlbCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxEYXRhW3Bvc10gPSBsYWJlbDtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmN4ID0geDtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmN5ID0geTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFiZWxEYXRhW3Bvc10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxEYXRhW3Bvc10gPSBlZGdlTGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZGlyID0gKGN1cnJlbnQuZGlyICsgMSkgJSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnRvdXJUcmFjaW5nKHN5OiBudW1iZXIsIHN4OiBudW1iZXIsIGxhYmVsOiBudW1iZXIsIGNvbG9yOiBudW1iZXIsIGVkZ2VMYWJlbDogbnVtYmVyKTogQ29udG91clZlcnRleCB7XG4gICAgICAgIGxldCBGdjogQ29udG91clZlcnRleCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQ6IEN1cnJlbnQgPSB7XG4gICAgICAgICAgICBjeDogc3gsXG4gICAgICAgICAgICBjeTogc3ksXG4gICAgICAgICAgICBkaXI6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy50cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VMYWJlbCkpIHtcbiAgICAgICAgICAgIEZ2ID0ge1xuICAgICAgICAgICAgICAgIHg6IHN4LFxuICAgICAgICAgICAgICAgIHk6IHN5LFxuICAgICAgICAgICAgICAgIGRpcjogY3VycmVudC5kaXIsXG4gICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICBwcmV2OiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IEN2ID0gRnY7XG4gICAgICAgICAgICBsZXQgbGRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgbGV0IFAgPSB7XG4gICAgICAgICAgICAgICAgeDogY3VycmVudC5jeCxcbiAgICAgICAgICAgICAgICB5OiBjdXJyZW50LmN5LFxuICAgICAgICAgICAgICAgIGRpcjogMCxcbiAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIHByZXY6IEN2XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ3YubmV4dCA9IFA7XG4gICAgICAgICAgICBDdiA9IFA7XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmRpciA9IChjdXJyZW50LmRpciArIDYpICUgODtcblxuICAgICAgICAgICAgICAgIHRoaXMudHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlTGFiZWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxkaXIgIT09IGN1cnJlbnQuZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIEN2LmRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgICAgICAgICBQID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogY3VycmVudC5jeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGN1cnJlbnQuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldjogQ3ZcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgQ3YubmV4dCA9IFA7XG4gICAgICAgICAgICAgICAgICAgIEN2ID0gUDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBDdi5kaXIgPSBsZGlyO1xuICAgICAgICAgICAgICAgICAgICBDdi54ID0gY3VycmVudC5jeDtcbiAgICAgICAgICAgICAgICAgICAgQ3YueSA9IGN1cnJlbnQuY3k7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgfSB3aGlsZSAoY3VycmVudC5jeCAhPT0gc3ggfHwgY3VycmVudC5jeSAhPT0gc3kpO1xuXG4gICAgICAgICAgICBGdi5wcmV2ID0gQ3YucHJldjtcbiAgICAgICAgICAgIEN2LnByZXYubmV4dCA9IEZ2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBGdjtcbiAgICB9XG59XG4iLCIvKipcbiAqIEBib3Jyb3dzIGh0dHA6Ly93d3cuY29kZXByb2plY3QuY29tL1RpcHMvNDA3MTcyL0Nvbm5lY3RlZC1Db21wb25lbnQtTGFiZWxpbmctYW5kLVZlY3Rvcml6YXRpb25cbiAqL1xuXG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICcuLi9jb21tb24vaW1hZ2Utd3JhcHBlcic7XG5pbXBvcnQgeyBDb250b3VyVmVydGV4LCBUcmFjZXIgfSBmcm9tICcuL3RyYWNlcic7XG5cbmVudW0gRWRnZUxhYmVsIHtcbiAgICBPdXRzaWRlID0gLTMyNzY3LFxuICAgIEluc2lkZSA9IC0zMjc2NlxufTtcblxuZW51bSBDb250b3VyRGlyZWN0aW9uIHtcbiAgICBDVyA9IDAsXG4gICAgQ0NXID0gMSxcbiAgICBVbmtub3duID0gMlxufTtcblxuaW50ZXJmYWNlIENvbnRvdXIge1xuICAgIGRpcjogQ29udG91ckRpcmVjdGlvbjtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGZpcnN0VmVydGV4OiBDb250b3VyVmVydGV4O1xuICAgIHByZXZpb3VzUGVlcj86IENvbnRvdXI7XG4gICAgbmV4dFBlZXI/OiBDb250b3VyO1xuICAgIGluc2lkZUNvbnRvdXJzOiBDb250b3VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhc3RlclJlc3VsdCB7XG4gICAgY2M6IENvbnRvdXI7XG4gICAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJhc3Rlcml6ZXIge1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdHJhY2VyOiBUcmFjZXI7XG4gICAgcHJpdmF0ZSBfaW1hZ2VEYXRhOiBVaW50OEFycmF5O1xuICAgIHByaXZhdGUgX2xhYmVsRGF0YTogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyPFVpbnQ4QXJyYXk+LCBsYWJlbFdyYXBwZXI6IEltYWdlV3JhcHBlcjxBcnJheTxudW1iZXI+Pikge1xuICAgICAgICB0aGlzLl9pbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICAgICAgdGhpcy5fbGFiZWxEYXRhID0gbGFiZWxXcmFwcGVyLmRhdGEgYXMgQXJyYXk8bnVtYmVyPjtcbiAgICAgICAgdGhpcy5fd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgICAgICB0aGlzLl90cmFjZXIgPSBuZXcgVHJhY2VyKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKTtcbiAgICB9XG5cbiAgICByYXN0ZXJpemUoZGVwdGhMYWJlbDogbnVtYmVyKTogUmFzdGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3QgY29sb3JNYXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDAwOyBpKyspIHtcbiAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbG9yTWFwWzBdID0gdGhpcy5faW1hZ2VEYXRhWzBdO1xuXG4gICAgICAgIGxldCBjYzogQ29udG91ciA9IG51bGw7XG4gICAgICAgIGxldCBzYzogQ29udG91cjtcbiAgICAgICAgbGV0IGNvbm5lY3RlZENvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGxldCBjeSA9IDE7IGN5IDwgdGhpcy5faGVpZ2h0IC0gMTsgY3krKykge1xuICAgICAgICAgICAgbGV0IGxhYmVsSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGJjID0gY29sb3JNYXBbMF07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGN4ID0gMTsgY3ggPCB0aGlzLl93aWR0aCAtIDE7IGN4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBjeSAqIHRoaXMuX3dpZHRoICsgY3g7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFiZWxEYXRhW3Bvc10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLl9pbWFnZURhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yICE9PSBiYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYyA9IGNvbm5lY3RlZENvdW50ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtsY10gPSBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleCA9IHRoaXMuX3RyYWNlci5jb250b3VyVHJhY2luZyhjeSwgY3gsIGxjLCBjb2xvciwgRWRnZUxhYmVsLk91dHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJbmRleCA9IGxjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwOiBDb250b3VyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiBDb250b3VyRGlyZWN0aW9uLkNXLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxhYmVsSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleDogdmVydGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBlZXI6IGNjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlQ29udG91cnM6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5wcmV2aW91c1BlZXIgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleCA9IHRoaXMuX3RyYWNlci5jb250b3VyVHJhY2luZyhjeSwgY3gsIEVkZ2VMYWJlbC5JbnNpZGUsIGNvbG9yLCBsYWJlbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHA6IENvbnRvdXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI6IGRlcHRoTGFiZWwgPT09IDAgPyBDb250b3VyRGlyZWN0aW9uLkNDVyA6IENvbnRvdXJEaXJlY3Rpb24uQ1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleDogdmVydGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGRlcHRoTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVDb250b3VyczogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IGNjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHNjICE9PSBudWxsKSAmJiBzYy5pbmRleCAhPT0gbGFiZWxJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MgPSBzYy5uZXh0UGVlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmV4dFBlZXIgPSBzYy5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYy5pbnNpZGVDb250b3VycyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLmluc2lkZUNvbnRvdXJzLnByZXZpb3VzUGVlciA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy5pbnNpZGVDb250b3VycyA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbERhdGFbcG9zXSA9IGxhYmVsSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2xhYmVsRGF0YVtwb3NdID09PSBFZGdlTGFiZWwuSW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBiYyA9IHRoaXMuX2ltYWdlRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFiZWxEYXRhW3Bvc10gPT09IEVkZ2VMYWJlbC5PdXRzaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsSW5kZXggPSB0aGlzLl9sYWJlbERhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvck1hcFtsYWJlbEluZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzYyA9IGNjO1xuICAgICAgICB3aGlsZSAoc2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNjLmluZGV4ID0gZGVwdGhMYWJlbDtcbiAgICAgICAgICAgIHNjID0gc2MubmV4dFBlZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2MsXG4gICAgICAgICAgICBjb3VudDogY29ubmVjdGVkQ291bnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBkcmF3Q29udG91cihjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBmaXJzdENvbnRvdXI6IENvbnRvdXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmVkJztcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuXG4gICAgICAgIGxldCBwcSA9IGZpcnN0Q29udG91cjtcbiAgICAgICAgbGV0IGlxID0gcHEgJiYgcHEuaW5zaWRlQ29udG91cnM7XG5cbiAgICAgICAgd2hpbGUgKHBxICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcSA9IGlxIHx8IHBxO1xuXG4gICAgICAgICAgICBpZiAoaXEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpcSA9IGlxLm5leHRQZWVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcSA9IHBxLm5leHRQZWVyO1xuICAgICAgICAgICAgICAgIGlxID0gcHEgJiYgcHEuaW5zaWRlQ29udG91cnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAocS5kaXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRvdXJEaXJlY3Rpb24uQ1c6IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBDb250b3VyRGlyZWN0aW9uLkNDVzoge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBDb250b3VyRGlyZWN0aW9uLlVua25vd246IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHAgPSBxLmZpcnN0VmVydGV4O1xuICAgICAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHAueCwgcC55KTtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocC54LCBwLnkpO1xuICAgICAgICAgICAgfSB3aGlsZSAocCAhPT0gcS5maXJzdFZlcnRleCk7XG5cbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cbmZ1bmN0aW9uIFNrZWxldG9uaXplcihzdGRsaWIsIGZvcmVpZ24sIGJ1ZmZlcikge1xuICAgIFwidXNlIGFzbVwiO1xuXG4gICAgdmFyIGltYWdlcyA9IG5ldyBzdGRsaWIuVWludDhBcnJheShidWZmZXIpLFxuICAgICAgICBzaXplID0gZm9yZWlnbi5zaXplIHwgMCxcbiAgICAgICAgaW11bCA9IHN0ZGxpYi5NYXRoLmltdWw7XG5cbiAgICBmdW5jdGlvbiBlcm9kZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyID0gaW5JbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB2ID0gMCxcbiAgICAgICAgICAgIHUgPSAwLFxuICAgICAgICAgICAgc3VtID0gMCxcbiAgICAgICAgICAgIHlTdGFydDEgPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MiA9IDAsXG4gICAgICAgICAgICB4U3RhcnQxID0gMCxcbiAgICAgICAgICAgIHhTdGFydDIgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmb3IgKHYgPSAxOyAodiB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdiA9ICh2ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgZm9yICh1ID0gMTsgKHUgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHUgPSAodSArIDEpIHwgMCkge1xuICAgICAgICAgICAgICAgIHlTdGFydDEgPSAob2Zmc2V0IC0gc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHlTdGFydDIgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDEgPSAodSAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQyID0gKHUgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgc3VtID0gKChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQyKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDIpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICAgICAgICAgIGlmICgoc3VtIHwgMCkgPT0gKDUgfCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3VidHJhY3QoYUltYWdlUHRyLCBiSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGFJbWFnZVB0ciA9IGFJbWFnZVB0ciB8IDA7XG4gICAgICAgIGJJbWFnZVB0ciA9IGJJbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9XG4gICAgICAgICAgICAgICAgKChpbWFnZXNbKGFJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApIC0gKGltYWdlc1soYkltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJpdHdpc2VPcihhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyID0gYUltYWdlUHRyIHwgMDtcbiAgICAgICAgYkltYWdlUHRyID0gYkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID1cbiAgICAgICAgICAgICAgICAoKGltYWdlc1soYUltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkgfCAoaW1hZ2VzWyhiSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY291bnROb25aZXJvKGltYWdlUHRyKSB7XG4gICAgICAgIGltYWdlUHRyID0gaW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBzdW0gPSAwLFxuICAgICAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIHN1bSA9ICgoc3VtIHwgMCkgKyAoaW1hZ2VzWyhpbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHN1bSB8IDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluaXQoaW1hZ2VQdHIsIHZhbHVlKSB7XG4gICAgICAgIGltYWdlUHRyID0gaW1hZ2VQdHIgfCAwO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlIHwgMDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpbGF0ZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyID0gaW5JbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB2ID0gMCxcbiAgICAgICAgICAgIHUgPSAwLFxuICAgICAgICAgICAgc3VtID0gMCxcbiAgICAgICAgICAgIHlTdGFydDEgPSAwLFxuICAgICAgICAgICAgeVN0YXJ0MiA9IDAsXG4gICAgICAgICAgICB4U3RhcnQxID0gMCxcbiAgICAgICAgICAgIHhTdGFydDIgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmb3IgKHYgPSAxOyAodiB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdiA9ICh2ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgZm9yICh1ID0gMTsgKHUgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHUgPSAodSArIDEpIHwgMCkge1xuICAgICAgICAgICAgICAgIHlTdGFydDEgPSAob2Zmc2V0IC0gc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHlTdGFydDIgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDEgPSAodSAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQyID0gKHUgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgc3VtID0gKChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQyKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDIpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICAgICAgICAgIGlmICgoc3VtIHwgMCkgPiAoMCB8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZW1jcHkoc3JjSW1hZ2VQdHIsIGRzdEltYWdlUHRyKSB7XG4gICAgICAgIHNyY0ltYWdlUHRyID0gc3JjSW1hZ2VQdHIgfCAwO1xuICAgICAgICBkc3RJbWFnZVB0ciA9IGRzdEltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1soZHN0SW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPSAoaW1hZ2VzWyhzcmNJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0JvcmRlcihpbWFnZVB0cikge1xuICAgICAgICBpbWFnZVB0ciA9IGltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgeCA9IDAsXG4gICAgICAgICAgICB5ID0gMDtcblxuICAgICAgICBmb3IgKHggPSAwOyAoeCB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgeCA9ICh4ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeCkgfCAwXSA9IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKCh5ICsgc2l6ZSkgLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKHkgKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh4ID0gMDsgKHggfCAwKSA8IChzaXplIHwgMCk7IHggPSAoeCArIDEpIHwgMCkge1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICh5ICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2tlbGV0b25pemUoKSB7XG4gICAgICAgIHZhciBzdWJJbWFnZVB0ciA9IDAsXG4gICAgICAgICAgICBlcm9kZWRJbWFnZVB0ciA9IDAsXG4gICAgICAgICAgICB0ZW1wSW1hZ2VQdHIgPSAwLFxuICAgICAgICAgICAgc2tlbEltYWdlUHRyID0gMCxcbiAgICAgICAgICAgIHN1bSA9IDAsXG4gICAgICAgICAgICBkb25lID0gMDtcblxuICAgICAgICBlcm9kZWRJbWFnZVB0ciA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuICAgICAgICB0ZW1wSW1hZ2VQdHIgPSAoZXJvZGVkSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwO1xuICAgICAgICBza2VsSW1hZ2VQdHIgPSAodGVtcEltYWdlUHRyICsgZXJvZGVkSW1hZ2VQdHIpIHwgMDtcblxuICAgICAgICAvLyBpbml0IHNrZWwtaW1hZ2VcbiAgICAgICAgaW5pdChza2VsSW1hZ2VQdHIsIDApO1xuICAgICAgICB6ZXJvQm9yZGVyKHN1YkltYWdlUHRyKTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlcm9kZShzdWJJbWFnZVB0ciwgZXJvZGVkSW1hZ2VQdHIpO1xuICAgICAgICAgICAgZGlsYXRlKGVyb2RlZEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VidHJhY3Qoc3ViSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgdGVtcEltYWdlUHRyKTtcbiAgICAgICAgICAgIGJpdHdpc2VPcihza2VsSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgc2tlbEltYWdlUHRyKTtcbiAgICAgICAgICAgIG1lbWNweShlcm9kZWRJbWFnZVB0ciwgc3ViSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VtID0gY291bnROb25aZXJvKHN1YkltYWdlUHRyKSB8IDA7XG4gICAgICAgICAgICBkb25lID0gKChzdW0gfCAwKSA9PSAwIHwgMCk7XG4gICAgICAgIH0gd2hpbGUgKCFkb25lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBza2VsZXRvbml6ZTogc2tlbGV0b25pemVcbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgU2tlbGV0b25pemVyO1xuLyogZXNsaW50LWVuYWJsZSBlcWVxZXEgKi9cbiIsImltcG9ydCBfcG9seWZpbGxzIGZyb20gJy4vY29tbW9uL3BvbHlmaWxscyc7XG5pbXBvcnQgeyBSZXN1bHRDb2xsZWN0b3IgfSBmcm9tICcuL2FuYWx5dGljcy9yZXN1bHQtY29sbGVjdG9yJztcbmltcG9ydCB7IEJveCB9IGZyb20gJy4vY29tbW9uL2JveCc7XG5pbXBvcnQgeyBFdmVudENhbGxiYWNrLCBFdmVudHMsIEV2ZW50U3Vic2NyaXB0aW9uIH0gZnJvbSAnLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCB7IEltYWdlRGVidWcgfSBmcm9tICcuL2NvbW1vbi9pbWFnZS1kZWJ1Zyc7XG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICcuL2NvbW1vbi9pbWFnZS13cmFwcGVyJztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9jb21tb24vbWVyZ2UnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuL2NvbW1vbi9wb2ludCc7XG5pbXBvcnQgeyBjb25maWcgYXMgZGVmYXVsdENvbmZpZywgUXVhZ2dhQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcbmltcG9ydCB7IEJhcmNvZGVEZWNvZGVyLCBRdWFnZ2FCYXJjb2RlIH0gZnJvbSAnLi9kZWNvZGVyL2JhcmNvZGUtZGVjb2Rlcic7XG5pbXBvcnQgeyBDYW1lcmFBY2Nlc3MgfSBmcm9tICcuL2lucHV0L2NhbWVyYS1hY2Nlc3MnO1xuaW1wb3J0IHsgRnJhbWVHcmFiYmVyIH0gZnJvbSAnLi9pbnB1dC9mcmFtZS1ncmFiYmVyJztcbmltcG9ydCB7IEltYWdlU3RyZWFtIH0gZnJvbSAnLi9pbnB1dC9pbWFnZS1zdHJlYW0nO1xuaW1wb3J0IHsgSW5wdXRTdHJlYW0gfSBmcm9tICcuL2lucHV0L2lucHV0LXN0cmVhbSc7XG5pbXBvcnQgeyBMaXZlU3RyZWFtIH0gZnJvbSAnLi9pbnB1dC9saXZlLXN0cmVhbSc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbSB9IGZyb20gJy4vaW5wdXQvdmlkZW8tc3RyZWFtJztcbmltcG9ydCB7IGNoZWNrSW1hZ2VDb25zdHJhaW50cyB9IGZyb20gJy4vaW5wdXQvaW5wdXQtc3RyZWFtLXV0aWxzJztcbmltcG9ydCB7IEJhcmNvZGVMb2NhdG9yIH0gZnJvbSAnLi9sb2NhdG9yL2JhcmNvZGUtbG9jYXRvcic7XG5pbXBvcnQgeyBCYXJjb2RlUmVhZGVyRGVjbGFyYXRpb24gfSBmcm9tICcuL3JlYWRlci9iYXJjb2RlLXJlYWRlcic7XG5cbmludGVyZmFjZSBXb3JrZXJUaHJlYWQge1xuICAgIHdvcmtlcjogV29ya2VyO1xuICAgIGltYWdlRGF0YTogVWludDhBcnJheTtcbiAgICBidXN5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1YWdnYUNhbnZhc0NvbnRhaW5lciB7XG4gICAgY3R4OiB7XG4gICAgICAgIGltYWdlOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgICAgIG92ZXJsYXk6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGltYWdlOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICAgICAgb3ZlcmxheTogSFRNTENhbnZhc0VsZW1lbnRcbiAgICB9XG59XG5cbmxldCBfaW5wdXRTdHJlYW06IElucHV0U3RyZWFtO1xubGV0IF9mcmFtZUdyYWJiZXI6IEZyYW1lR3JhYmJlcjtcbmxldCBfc3RvcHBlZDogYm9vbGVhbjtcbmNvbnN0IF9jYW52YXNDb250YWluZXI6IFF1YWdnYUNhbnZhc0NvbnRhaW5lciA9IHtcbiAgICBjdHg6IHtcbiAgICAgICAgaW1hZ2U6IG51bGwsXG4gICAgICAgIG92ZXJsYXk6IG51bGxcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBpbWFnZTogbnVsbCxcbiAgICAgICAgb3ZlcmxheTogbnVsbFxuICAgIH1cbn07XG5sZXQgX2lucHV0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI7XG5sZXQgX2xvY2F0b3I6IEJhcmNvZGVMb2NhdG9yO1xubGV0IF9ib3hTaXplOiBCb3g7XG5sZXQgX2RlY29kZXI6IEJhcmNvZGVEZWNvZGVyO1xubGV0IF93b3JrZXJQb29sID0gbmV3IEFycmF5PFdvcmtlclRocmVhZD4oKTtcbmxldCBfb25VSVRocmVhZDogYm9vbGVhbjtcbmxldCBfcmVzdWx0Q29sbGVjdG9yOiBSZXN1bHRDb2xsZWN0b3I7XG5sZXQgX2NvbmZpZzogUXVhZ2dhQ29uZmlnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgaW5pdChjb25maWc6IFF1YWdnYUNvbmZpZywgY2I6ICgpID0+IHZvaWQsIGltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcikge1xuICAgICAgICBfb25VSVRocmVhZCA9IHRydWU7XG4gICAgICAgIF9jb25maWcgPSBtZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xuICAgICAgICBpZiAoaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgICAgICBfb25VSVRocmVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgX2luaXRpYWxpemVEYXRhKGltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2luaXRJbnB1dFN0cmVhbShjYik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgQ2FtZXJhQWNjZXNzOiBDYW1lcmFBY2Nlc3MsXG5cbiAgICBJbWFnZURlYnVnOiBJbWFnZURlYnVnLFxuXG4gICAgSW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsXG5cbiAgICBSZXN1bHRDb2xsZWN0b3I6IFJlc3VsdENvbGxlY3RvcixcblxuICAgIGdldCBjYW52YXMoKTogUXVhZ2dhQ2FudmFzQ29udGFpbmVyIHtcbiAgICAgICAgcmV0dXJuIF9jYW52YXNDb250YWluZXI7XG4gICAgfSxcblxuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAoX29uVUlUaHJlYWQgJiYgX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIF9zdGFydENvbnRpbnVvdXNVcGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wKCk6IHZvaWQge1xuICAgICAgICBfc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIF9hZGp1c3RXb3JrZXJQb29sKDApO1xuICAgICAgICBpZiAoX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIENhbWVyYUFjY2Vzcy5yZWxlYXNlKCk7XG4gICAgICAgICAgICBfaW5wdXRTdHJlYW0uY2xlYXJFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVjb2RlU2luZ2xlKGNvbmZpZzogUXVhZ2dhQ29uZmlnLCByZXN1bHRDYWxsYmFjazogKF86IFF1YWdnYUJhcmNvZGUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgY29uZmlnID0gbWVyZ2Uoe1xuICAgICAgICAgICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnSW1hZ2VTdHJlYW0nLFxuICAgICAgICAgICAgICAgIHNlcXVlbmNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaXplOiA4MDAsXG4gICAgICAgICAgICAgICAgc3JjOiBjb25maWcuc3JjXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVtT2ZXb3JrZXJzOiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcuZGVidWcpID8gMCA6IDEsXG4gICAgICAgICAgICBsb2NhdG9yOiB7XG4gICAgICAgICAgICAgICAgaGFsZlNhbXBsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLmluaXQoY29uZmlnLCAoKSA9PiB7XG4gICAgICAgICAgICBFdmVudHMub25jZSgncHJvY2Vzc2VkJywgKHJlc3VsdDogUXVhZ2dhQmFyY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrLmNhbGwobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcGF1c2UoKTogdm9pZCB7XG4gICAgICAgIF9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgb25EZXRlY3RlZChjYWxsYmFjazogRXZlbnRTdWJzY3JpcHRpb24gfCBFdmVudENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICBvZmZEZXRlY3RlZChjYWxsYmFjazogRXZlbnRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICBFdmVudHMudW5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICBvblByb2Nlc3NlZChjYWxsYmFjazogRXZlbnRTdWJzY3JpcHRpb24gfCBFdmVudENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoJ3Byb2Nlc3NlZCcsIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgb2ZmUHJvY2Vzc2VkKGNhbGxiYWNrOiBFdmVudENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIEV2ZW50cy51bnN1YnNjcmliZSgncHJvY2Vzc2VkJywgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICBzZXRSZWFkZXJzKHJlYWRlcnM6IEFycmF5PEJhcmNvZGVSZWFkZXJEZWNsYXJhdGlvbj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKF9kZWNvZGVyKSB7XG4gICAgICAgICAgICBfZGVjb2Rlci5zZXRSZWFkZXJzKHJlYWRlcnMpO1xuICAgICAgICB9IGVsc2UgaWYgKF9vblVJVGhyZWFkICYmIF93b3JrZXJQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF93b3JrZXJQb29sLmZvckVhY2goKHsgd29ya2VyIH0pID0+IHdvcmtlci5wb3N0TWVzc2FnZSh7IGNtZDogJ3NldFJlYWRlcnMnLCByZWFkZXJzIH0pKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWdpc3RlclJlc3VsdENvbGxlY3RvcihyZXN1bHRDb2xsZWN0b3I6IFJlc3VsdENvbGxlY3Rvcik6IHZvaWQge1xuICAgICAgICBpZiAocmVzdWx0Q29sbGVjdG9yICYmIHR5cGVvZiByZXN1bHRDb2xsZWN0b3IuYWRkUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfcmVzdWx0Q29sbGVjdG9yID0gcmVzdWx0Q29sbGVjdG9yO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemVEYXRhKGltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcik6IHZvaWQge1xuICAgIF9pbml0QnVmZmVycyhpbWFnZVdyYXBwZXIpO1xuICAgIF9kZWNvZGVyID0gbmV3IEJhcmNvZGVEZWNvZGVyKF9jb25maWcuZGVjb2RlciwgX2lucHV0SW1hZ2VXcmFwcGVyKTtcbn1cblxuZnVuY3Rpb24gX2luaXRJbnB1dFN0cmVhbShjYWxsYmFjazogKGVycj86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGxldCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudDtcbiAgICBpZiAoX2NvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnVmlkZW9TdHJlYW0nKSB7XG4gICAgICAgIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgX2lucHV0U3RyZWFtID0gbmV3IFZpZGVvU3RyZWFtKHZpZGVvKTtcbiAgICB9IGVsc2UgaWYgKF9jb25maWcuaW5wdXRTdHJlYW0udHlwZSA9PT0gJ0ltYWdlU3RyZWFtJykge1xuICAgICAgICBfaW5wdXRTdHJlYW0gPSBuZXcgSW1hZ2VTdHJlYW0oKTtcbiAgICB9IGVsc2UgaWYgKF9jb25maWcuaW5wdXRTdHJlYW0udHlwZSA9PT0gJ0xpdmVTdHJlYW0nKSB7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gX2dldFZpZXdQb3J0KCk7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgdmlkZW8gPSB2aWV3cG9ydC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpO1xuICAgICAgICAgICAgaWYgKCF2aWRlbykge1xuICAgICAgICAgICAgICAgIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2lucHV0U3RyZWFtID0gbmV3IExpdmVTdHJlYW0odmlkZW8pO1xuICAgICAgICBDYW1lcmFBY2Nlc3MucmVxdWVzdCh2aWRlbywgX2NvbmZpZy5pbnB1dFN0cmVhbS5jb25zdHJhaW50cylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IF9pbnB1dFN0cmVhbS50cmlnZ2VyKCdjYW5yZWNvcmQnKSwgZXJyID0+IGNhbGxiYWNrKGVycikpO1xuICAgIH1cblxuICAgIF9pbnB1dFN0cmVhbS5zZXRBdHRyaWJ1dGUoJ3ByZWxvYWQnLCAnYXV0bycpO1xuICAgIF9pbnB1dFN0cmVhbS5jb25maWcgPSBfY29uZmlnLmlucHV0U3RyZWFtO1xuICAgIF9pbnB1dFN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdjYW5yZWNvcmQnLCBfY2FuUmVjb3JkLmJpbmQodGhpcywgY2FsbGJhY2spKTtcbn1cblxuZnVuY3Rpb24gX2dldFZpZXdQb3J0KCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCB0YXJnZXQgPSBfY29uZmlnLmlucHV0U3RyZWFtLnRhcmdldDtcbiAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYWxyZWFkeSBhIERPTSBlbGVtZW50XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlICcjaW50ZXJhY3RpdmUudmlld3BvcnQnIGFzIGEgZmFsbGJhY2sgc2VsZWN0b3IgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnID8gdGFyZ2V0IDogJyNpbnRlcmFjdGl2ZS52aWV3cG9ydCc7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9jYW5SZWNvcmQoY2I6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjaGVja0ltYWdlQ29uc3RyYWludHMoX2lucHV0U3RyZWFtLCBfY29uZmlnLmxvY2F0b3IpO1xuICAgIF9pbml0Q2FudmFzKCk7XG4gICAgX2ZyYW1lR3JhYmJlciA9IG5ldyBGcmFtZUdyYWJiZXIoX2lucHV0U3RyZWFtLCBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSk7XG5cbiAgICBfYWRqdXN0V29ya2VyUG9vbChfY29uZmlnLm51bU9mV29ya2VycywgKCkgPT4ge1xuICAgICAgICBpZiAoX2NvbmZpZy5udW1PZldvcmtlcnMgPT09IDApIHtcbiAgICAgICAgICAgIF9pbml0aWFsaXplRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2lucHV0U3RyZWFtLnBsYXkoKTtcbiAgICAgICAgY2IoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gX2luaXRDYW52YXMoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBfZ2V0Vmlld1BvcnQoKTtcbiAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMuaW1nQnVmZmVyJyk7XG4gICAgICAgIGlmICghX2NhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UpIHtcbiAgICAgICAgICAgIF9jYW52YXNDb250YWluZXIuZG9tLmltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5jbGFzc05hbWUgPSAnaW1nQnVmZmVyJztcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCAmJiBfY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdJbWFnZVN0cmVhbScpIHtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5hcHBlbmRDaGlsZChfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5jdHguaW1hZ2UgPSBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZS53aWR0aCA9IF9pbnB1dFN0cmVhbS5jYW52YXNXaWR0aDtcbiAgICAgICAgX2NhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UuaGVpZ2h0ID0gX2lucHV0U3RyZWFtLmNhbnZhc0hlaWdodDtcblxuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzLmRyYXdpbmdCdWZmZXInKTtcbiAgICAgICAgaWYgKCFfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5KSB7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5LmNsYXNzTmFtZSA9ICdkcmF3aW5nQnVmZmVyJztcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKF9jYW52YXNDb250YWluZXIuZG9tLm92ZXJsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2xlYXJGaXggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpO1xuICAgICAgICAgICAgY2xlYXJGaXguc2V0QXR0cmlidXRlKCdjbGVhcicsICdhbGwnKTtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LmFwcGVuZENoaWxkKGNsZWFyRml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmN0eC5vdmVybGF5ID0gX2NhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheS5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5LndpZHRoID0gX2lucHV0U3RyZWFtLmNhbnZhc1dpZHRoO1xuICAgICAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5LmhlaWdodCA9IF9pbnB1dFN0cmVhbS5jYW52YXNIZWlnaHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfaW5pdEJ1ZmZlcnMoaW1hZ2VXcmFwcGVyPzogSW1hZ2VXcmFwcGVyKTogdm9pZCB7XG4gICAgaWYgKGltYWdlV3JhcHBlcikge1xuICAgICAgICBfaW5wdXRJbWFnZVdyYXBwZXIgPSBpbWFnZVdyYXBwZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2lucHV0SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICB4OiBfaW5wdXRTdHJlYW0ud2lkdGgsXG4gICAgICAgICAgICB5OiBfaW5wdXRTdHJlYW0uaGVpZ2h0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKF9pbnB1dEltYWdlV3JhcHBlci5zaXplKTtcbiAgICB9XG4gICAgX2JveFNpemUgPSBbXG4gICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICB7IHg6IDAsIHk6IF9pbnB1dEltYWdlV3JhcHBlci5zaXplLnkgfSxcbiAgICAgICAgeyB4OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54LCB5OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS55IH0sXG4gICAgICAgIHsgeDogX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueCwgeTogMCB9XG4gICAgXTtcbiAgICBfbG9jYXRvciA9IG5ldyBCYXJjb2RlTG9jYXRvcihfaW5wdXRJbWFnZVdyYXBwZXIsIF9jb25maWcubG9jYXRvcik7XG59XG5cbmZ1bmN0aW9uIF90cmFuc2Zvcm0ocG9seWdvbjogUmVhZG9ubHlBcnJheTxQb2ludD4sIG9mZnNldDogUG9pbnQpOiB2b2lkIHtcbiAgICBwb2x5Z29uLmZvckVhY2godmVydGV4ID0+IHtcbiAgICAgICAgdmVydGV4LnggKz0gb2Zmc2V0Lng7XG4gICAgICAgIHZlcnRleC55ICs9IG9mZnNldC55O1xuICAgIH0pXG59XG5cbmZ1bmN0aW9uIF90cmFuc2Zvcm1SZXN1bHQocmVzdWx0OiBRdWFnZ2FCYXJjb2RlLCBvZmZzZXQ6IFBvaW50KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5iYXJjb2Rlcykge1xuICAgICAgICByZXN1bHQuYmFyY29kZXMuZm9yRWFjaChiYXJjb2RlID0+IF90cmFuc2Zvcm1SZXN1bHQoYmFyY29kZSwgb2Zmc2V0KSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5saW5lKSB7XG4gICAgICAgIF90cmFuc2Zvcm0ocmVzdWx0LmxpbmUsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5ib3gpIHtcbiAgICAgICAgX3RyYW5zZm9ybShyZXN1bHQuYm94LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYm94ZXMpIHtcbiAgICAgICAgcmVzdWx0LmJveGVzLmZvckVhY2goYm94ID0+IF90cmFuc2Zvcm0oYm94LCBvZmZzZXQpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9hZGRSZXN1bHQocmVzdWx0OiBRdWFnZ2FCYXJjb2RlLCBpbWFnZURhdGE6IFVpbnQ4QXJyYXksIGNhbnZhc1dpZHRoOiBudW1iZXIsIGNhbnZhc0hlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGltYWdlRGF0YSAmJiBfcmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgIGlmIChyZXN1bHQuYmFyY29kZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5iYXJjb2Rlcy5mb3JFYWNoKCh7IGNvZGVSZXN1bHQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHRDb2xsZWN0b3IuYWRkUmVzdWx0KGltYWdlRGF0YSwgY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCwgY29kZVJlc3VsdClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY29kZVJlc3VsdCkge1xuICAgICAgICAgICAgX3Jlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQoaW1hZ2VEYXRhLCBjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0LCByZXN1bHQuY29kZVJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9oYXNDb2RlUmVzdWx0KHJlc3VsdDogUXVhZ2dhQmFyY29kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXN1bHQgJiYgKCEhcmVzdWx0LmNvZGVSZXN1bHQgfHwgcmVzdWx0LmJhcmNvZGVzICYmIHJlc3VsdC5iYXJjb2Rlcy5zb21lKGJhcmNvZGUgPT4gISFiYXJjb2RlLmNvZGVSZXN1bHQpKTtcbn1cblxuZnVuY3Rpb24gX3B1Ymxpc2hSZXN1bHQocmVzdWx0PzogUXVhZ2dhQmFyY29kZSwgaW1hZ2VEYXRhPzogVWludDhBcnJheSk6IHZvaWQge1xuICAgIGxldCByZXN1bHRUb1B1Ymxpc2g6IFF1YWdnYUJhcmNvZGUgfCBBcnJheTxRdWFnZ2FCYXJjb2RlPiA9IHJlc3VsdDtcblxuICAgIGlmIChyZXN1bHQgJiYgX29uVUlUaHJlYWQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gX2lucHV0U3RyZWFtLnRvcExlZnQ7XG5cbiAgICAgICAgaWYgKG9mZnNldC54ICE9PSAwIHx8IG9mZnNldC55ICE9PSAwKSB7XG4gICAgICAgICAgICBfdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9hZGRSZXN1bHQocmVzdWx0LCBpbWFnZURhdGEsIF9pbnB1dFN0cmVhbS5jYW52YXNXaWR0aCwgX2lucHV0U3RyZWFtLmNhbnZhc0hlaWdodCk7XG4gICAgICAgIHJlc3VsdFRvUHVibGlzaCA9IHJlc3VsdC5iYXJjb2RlcyB8fCByZXN1bHQ7XG4gICAgfVxuXG4gICAgRXZlbnRzLnB1Ymxpc2goJ3Byb2Nlc3NlZCcsIHJlc3VsdFRvUHVibGlzaCk7XG4gICAgaWYgKF9oYXNDb2RlUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgRXZlbnRzLnB1Ymxpc2goJ2RldGVjdGVkJywgcmVzdWx0VG9QdWJsaXNoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9sb2NhdGVBbmREZWNvZGUoKTogdm9pZCB7XG4gICAgY29uc3QgYm94ZXMgPSBfY29uZmlnLmxvY2F0ZSA/IF9sb2NhdG9yLmxvY2F0ZSgpIDogW19ib3hTaXplXTtcbiAgICBjb25zdCByZXN1bHQgPSBfZGVjb2Rlci5kZWNvZGVGcm9tQm91bmRpbmdCb3hlcyhib3hlcyk7XG4gICAgX3B1Ymxpc2hSZXN1bHQocmVzdWx0LCBfaW5wdXRJbWFnZVdyYXBwZXIuZGF0YSk7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKF9vblVJVGhyZWFkKSB7XG4gICAgICAgIGlmIChfd29ya2VyUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXb3JrZXIgPSBfd29ya2VyUG9vbC5maW5kKCh7IGJ1c3kgfSkgPT4gIWJ1c3kpO1xuICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFsbCB3b3JrZXJzIGFyZSBidXN5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF2YWlsYWJsZVdvcmtlci5pbWFnZURhdGE7XG5cbiAgICAgICAgICAgIGlmIChfZnJhbWVHcmFiYmVyLmdyYWIoaW1hZ2VEYXRhKSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdvcmtlci5idXN5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXb3JrZXIud29ya2VyLnBvc3RNZXNzYWdlKHsgY21kOiAncHJvY2VzcycsIGltYWdlRGF0YSB9LCBbaW1hZ2VEYXRhLmJ1ZmZlcl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9mcmFtZUdyYWJiZXIuZ3JhYihfaW5wdXRJbWFnZVdyYXBwZXIuZGF0YSkpIHtcbiAgICAgICAgICAgIF9sb2NhdGVBbmREZWNvZGUoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIF9sb2NhdGVBbmREZWNvZGUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9zdGFydENvbnRpbnVvdXNVcGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZGVsYXkgPSAxMDAwIC8gKF9jb25maWcuZnJlcXVlbmN5IHx8IDYwKTtcbiAgICBsZXQgbmV4dCA9IG51bGw7XG4gICAgX3N0b3BwZWQgPSBmYWxzZTtcblxuICAgIChmdW5jdGlvbiBmcmFtZSh0aW1lc3RhbXApOiB2b2lkIHtcbiAgICAgICAgbmV4dCA9IG5leHQgfHwgdGltZXN0YW1wO1xuICAgICAgICBpZiAoIV9zdG9wcGVkKSB7XG4gICAgICAgICAgICBpZiAodGltZXN0YW1wID49IG5leHQpIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IGRlbGF5O1xuICAgICAgICAgICAgICAgIF91cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfShwZXJmb3JtYW5jZS5ub3coKSkpO1xufVxuXG5mdW5jdGlvbiBfaW5pdFdvcmtlcihjYjogKHdvcmtlclRocmVhZDogV29ya2VyVGhyZWFkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgYmxvYlVSTCA9IF9nZW5lcmF0ZVdvcmtlckJsb2IoKTtcbiAgICBjb25zdCB3b3JrZXJUaHJlYWQgPSB7XG4gICAgICAgIHdvcmtlcjogbmV3IFdvcmtlcihibG9iVVJMKSxcbiAgICAgICAgaW1hZ2VEYXRhOiBuZXcgVWludDhBcnJheShfaW5wdXRTdHJlYW0ud2lkdGggKiBfaW5wdXRTdHJlYW0uaGVpZ2h0KSxcbiAgICAgICAgYnVzeTogdHJ1ZVxuICAgIH07XG5cbiAgICB3b3JrZXJUaHJlYWQud29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5ldmVudCA9PT0gJ2luaXRpYWxpemVkJykge1xuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVVJMKTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5pbWFnZURhdGEpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYih3b3JrZXJUaHJlYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnQgPT09ICdwcm9jZXNzZWQnKSB7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmltYWdlRGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIF9wdWJsaXNoUmVzdWx0KGRhdGEucmVzdWx0LCB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZXJyb3I6JywgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB3b3JrZXJUaHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgY21kOiAnaW5pdCcsXG4gICAgICAgIHNpemU6IHsgeDogX2lucHV0U3RyZWFtLndpZHRoLCB5OiBfaW5wdXRTdHJlYW0uaGVpZ2h0IH0sXG4gICAgICAgIGltYWdlRGF0YTogd29ya2VyVGhyZWFkLmltYWdlRGF0YSxcbiAgICAgICAgY29uZmlnOiBtZXJnZShfY29uZmlnLCB7IGlucHV0U3RyZWFtOiB7IHRhcmdldDogbnVsbCB9IH0pXG4gICAgfSwgW3dvcmtlclRocmVhZC5pbWFnZURhdGEuYnVmZmVyXSk7XG59XG5cbmZ1bmN0aW9uIF93b3JrZXJJbnRlcmZhY2UoZmFjdG9yeTogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBsZXQgUXVhZ2dhOiBhbnk7XG4gICAgY29uc3Qgd29ya2VyOiBhbnkgPSBzZWxmO1xuICAgIGxldCBpbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcblxuICAgIGlmIChmYWN0b3J5KSB7XG4gICAgICAgIFF1YWdnYSA9IGZhY3RvcnkoKS5kZWZhdWx0O1xuICAgICAgICBpZiAoIVF1YWdnYSkge1xuICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgZXZlbnQ6ICdlcnJvcicsIG1lc3NhZ2U6ICdRdWFnZ2EgY291bGQgbm90IGJlIGNyZWF0ZWQnIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZi5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY21kID09PSAnaW5pdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUXVhZ2dhQ29uZmlnID0gZGF0YS5jb25maWc7XG4gICAgICAgICAgICBjb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgICAgIGltYWdlV3JhcHBlciA9IG5ldyBRdWFnZ2EuSW1hZ2VXcmFwcGVyKHsgeDogZGF0YS5zaXplLngsIHk6IGRhdGEuc2l6ZS55IH0sIG5ldyBVaW50OEFycmF5KGRhdGEuaW1hZ2VEYXRhKSk7XG4gICAgICAgICAgICBRdWFnZ2EuaW5pdChcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgKCkgPT4gd29ya2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICB7IGV2ZW50OiAnaW5pdGlhbGl6ZWQnLCBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhIH0sIFtpbWFnZVdyYXBwZXIuZGF0YS5idWZmZXJdXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBpbWFnZVdyYXBwZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBRdWFnZ2Eub25Qcm9jZXNzZWQoKHJlc3VsdDogUXVhZ2dhQmFyY29kZSkgPT5cbiAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIHsgZXZlbnQ6ICdwcm9jZXNzZWQnLCBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhLCByZXN1bHQgfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY21kID09PSAncHJvY2VzcycpIHtcbiAgICAgICAgICAgIGltYWdlV3JhcHBlci5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5pbWFnZURhdGEpO1xuICAgICAgICAgICAgUXVhZ2dhLnN0YXJ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jbWQgPT09ICdzZXRSZWFkZXJzJykge1xuICAgICAgICAgICAgUXVhZ2dhLnNldFJlYWRlcnMoZGF0YS5yZWFkZXJzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIF9nZW5lcmF0ZVdvcmtlckJsb2IoKTogc3RyaW5nIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGV0IGZhY3RvcnlTb3VyY2U6IHN0cmluZyA9IF9fZmFjdG9yeVNvdXJjZV9fIHx8ICcnO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYCgke193b3JrZXJJbnRlcmZhY2UudG9TdHJpbmcoKX0pKCR7ZmFjdG9yeVNvdXJjZX0pO2BdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuXG4gICAgcmV0dXJuIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xufVxuXG5mdW5jdGlvbiBfYWRqdXN0V29ya2VyUG9vbChjYXBhY2l0eTogbnVtYmVyLCBjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmNyZWFzZUJ5ID0gY2FwYWNpdHkgLSBfd29ya2VyUG9vbC5sZW5ndGg7XG5cbiAgICBpZiAoaW5jcmVhc2VCeSA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmNyZWFzZUJ5OyBpKyspIHtcbiAgICAgICAgICAgIF9pbml0V29ya2VyKHdvcmtlclRocmVhZCA9PiB7XG4gICAgICAgICAgICAgICAgX3dvcmtlclBvb2wucHVzaCh3b3JrZXJUaHJlYWQpO1xuICAgICAgICAgICAgICAgIGlmIChfd29ya2VyUG9vbC5sZW5ndGggPj0gY2FwYWNpdHkgJiYgY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmNyZWFzZUJ5IDwgMCkge1xuICAgICAgICAgICAgX3dvcmtlclBvb2wuc2xpY2UoaW5jcmVhc2VCeSkuZm9yRWFjaCgoeyB3b3JrZXIgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIHRlcm1pbmF0ZWQhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfd29ya2VyUG9vbCA9IF93b3JrZXJQb29sLnNsaWNlKDAsIGluY3JlYXNlQnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYiAmJiBjYigpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJveCB9IGZyb20gJy4uL2NvbW1vbi9ib3gnO1xuaW1wb3J0IHsgQ2x1c3RlciB9IGZyb20gJy4uL2NvbW1vbi9jbHVzdGVyJztcbmltcG9ydCB7IEhTViwgaHN2MnJnYiwgUkdCIH0gZnJvbSAnLi4vY29tbW9uL2hzdjJyZ2InO1xuaW1wb3J0IHsgSW1hZ2VEZWJ1ZyB9IGZyb20gJy4uL2NvbW1vbi9pbWFnZS1kZWJ1Zyc7XG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICcuLi9jb21tb24vaW1hZ2Utd3JhcHBlcic7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICcuLi9jb21tb24vbW9tZW50JztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvaW50JztcbmltcG9ydCB7IGNhbGN1bGF0ZVBhdGNoU2l6ZSB9IGZyb20gJy4uL2lucHV0L2lucHV0LXN0cmVhbS11dGlscyc7XG5pbXBvcnQgeyBCYXJjb2RlTG9jYXRvckNvbmZpZyB9IGZyb20gJy4vYmFyY29kZS1sb2NhdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBoYWxmU2FtcGxlLCBpbnZlcnQsIG90c3VUaHJlc2hvbGQsIHRyYW5zZm9ybVdpdGhNYXRyaXggfSBmcm9tICcuL2JhcmNvZGUtbG9jYXRvci11dGlscyc7XG5pbXBvcnQgeyBSYXN0ZXJpemVyIH0gZnJvbSAnLi9yYXN0ZXJpemVyJztcbmltcG9ydCBza2VsZXRvbml6ZXIgZnJvbSAnLi9za2VsZXRvbml6ZXInO1xuaW1wb3J0IHsgU2VhcmNoRGlyZWN0aW9ucyB9IGZyb20gJy4vdHJhY2VyJztcblxuaW50ZXJmYWNlIFBhdGNoIHtcbiAgICBib3g6IEJveDtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIG1vbWVudHM6IEFycmF5PE1vbWVudD47XG4gICAgcG9zOiBQb2ludDtcbiAgICByYWQ6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xufVxuXG50eXBlIFNjZWxldG9uaXplciA9IGFueTtcblxuY29uc3QgTW9tZW50U2ltaWxhcml0eVRocmVzaG9sZCA9IDAuOTtcblxuZXhwb3J0IGNsYXNzIEJhcmNvZGVMb2NhdG9yIHtcbiAgICBwcml2YXRlIF9jb25maWc6IEJhcmNvZGVMb2NhdG9yQ29uZmlnO1xuICAgIHByaXZhdGUgX2lucHV0SW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXI7XG4gICAgcHJpdmF0ZSBfY3VycmVudEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3NrZWxJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcbiAgICBwcml2YXRlIF9zdWJJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlcjtcbiAgICBwcml2YXRlIF9sYWJlbEltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyPEFycmF5PG51bWJlcj4+O1xuICAgIHByaXZhdGUgX2JpbmFyeUltYWdlV3JhcHBlcjogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3BhdGNoR3JpZDogSW1hZ2VXcmFwcGVyO1xuICAgIHByaXZhdGUgX3BhdGNoTGFiZWxHcmlkOiBJbWFnZVdyYXBwZXI8SW50MzJBcnJheT47XG4gICAgcHJpdmF0ZSBfaW1hZ2VUb1BhdGNoR3JpZDogQXJyYXk8UGF0Y2g+O1xuICAgIHByaXZhdGUgX3BhdGNoU2l6ZTogUG9pbnQ7XG4gICAgcHJpdmF0ZSBfYmluYXJ5Q29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHByaXZhdGUgX251bVBhdGNoZXM6IFBvaW50O1xuICAgIHByaXZhdGUgX3NrZWxldG9uaXplcjogU2NlbGV0b25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXRJbWFnZVdyYXBwZXI6IEltYWdlV3JhcHBlciwgY29uZmlnOiBCYXJjb2RlTG9jYXRvckNvbmZpZykge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyID0gaW5wdXRJbWFnZVdyYXBwZXI7XG4gICAgICAgIHRoaXMuX251bVBhdGNoZXMgPSB7IHg6IDAsIHk6IDAgfTtcblxuICAgICAgICB0aGlzLl9pbml0QnVmZmVycygpO1xuICAgICAgICB0aGlzLl9pbml0Q2FudmFzKCk7XG4gICAgfVxuXG4gICAgbG9jYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgICAgIGhhbGZTYW1wbGUodGhpcy5faW5wdXRJbWFnZVdyYXBwZXIsIHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYmluYXJpemVJbWFnZSgpO1xuICAgICAgICBjb25zdCBwYXRjaGVzRm91bmQgPSB0aGlzLl9maW5kUGF0Y2hlcygpO1xuICAgICAgICAvLyByZXR1cm4gdW5sZXNzIDUlIG9yIG1vcmUgcGF0Y2hlcyBhcmUgZm91bmRcbiAgICAgICAgaWYgKHBhdGNoZXNGb3VuZC5sZW5ndGggPCB0aGlzLl9udW1QYXRjaGVzLnggKiB0aGlzLl9udW1QYXRjaGVzLnkgKiAwLjA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJhc3Rlcml6ZSBhcmVhIGJ5IGNvbXBhcmluZyBhbmd1bGFyIHNpbWlsYXJpdHk7XG4gICAgICAgIGNvbnN0IG1heExhYmVsID0gdGhpcy5fcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKTtcbiAgICAgICAgaWYgKG1heExhYmVsIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWFyY2ggZm9yIGFyZWEgd2l0aCB0aGUgbW9zdCBwYXRjaGVzIChiaWdnZXN0IGNvbm5lY3RlZCBhcmVhKVxuICAgICAgICBjb25zdCB0b3BMYWJlbHMgPSB0aGlzLl9maW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKTtcbiAgICAgICAgaWYgKHRvcExhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm94ZXMgPSB0aGlzLl9maW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCk7XG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0QnVmZmVycygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5oYWxmU2FtcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gMiB8IDAsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5faW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gMiB8IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlV3JhcHBlciA9IHRoaXMuX2lucHV0SW1hZ2VXcmFwcGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKHRoaXMuX2NvbmZpZy5wYXRjaFNpemUsIHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZSk7XG5cbiAgICAgICAgdGhpcy5fbnVtUGF0Y2hlcy54ID0gdGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyB0aGlzLl9wYXRjaFNpemUueCB8IDA7XG4gICAgICAgIHRoaXMuX251bVBhdGNoZXMueSA9IHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gdGhpcy5fcGF0Y2hTaXplLnkgfCAwO1xuXG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLCB1bmRlZmluZWQsIFVpbnQ4QXJyYXksIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9sYWJlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fcGF0Y2hTaXplLCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcblxuICAgICAgICBjb25zdCBza2VsZXRvbkltYWdlRGF0YSA9IG5ldyBBcnJheUJ1ZmZlcig2NCAqIDEwMjQpO1xuICAgICAgICB0aGlzLl9zdWJJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKHRoaXMuX3BhdGNoU2l6ZSwgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIDAsIHRoaXMuX3BhdGNoU2l6ZS54ICogdGhpcy5fcGF0Y2hTaXplLnkpKTtcbiAgICAgICAgdGhpcy5fc2tlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIodGhpcy5fcGF0Y2hTaXplLFxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIHRoaXMuX3BhdGNoU2l6ZS54ICogdGhpcy5fcGF0Y2hTaXplLnkgKiAzLCB0aGlzLl9wYXRjaFNpemUueCAqIHRoaXMuX3BhdGNoU2l6ZS55KSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3NrZWxldG9uaXplciA9IHNrZWxldG9uaXplcihcbiAgICAgICAgICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSA/IHNlbGYgOiBnbG9iYWwsXG4gICAgICAgICAgICB7IHNpemU6IHRoaXMuX3BhdGNoU2l6ZS54IH0sXG4gICAgICAgICAgICBza2VsZXRvbkltYWdlRGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNpemUgPSB7XG4gICAgICAgICAgICB4OiAodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54KSB8IDAsXG4gICAgICAgICAgICB5OiAodGhpcy5fY3VycmVudEltYWdlV3JhcHBlci5zaXplLnkgLyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55KSB8IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcGF0Y2hMYWJlbEdyaWQgPSBuZXcgSW1hZ2VXcmFwcGVyKHNpemUsIHVuZGVmaW5lZCwgSW50MzJBcnJheSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3BhdGNoR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoc2l6ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB0aGlzLl9pbWFnZVRvUGF0Y2hHcmlkID0gbmV3IEFycmF5PFBhdGNoPih0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdENhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy51c2VXb3JrZXIgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5jbGFzc05hbWUgPSAnYmluYXJ5QnVmZmVyJztcbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZyAmJiB0aGlzLl9jb25maWcuZGVidWcuc2hvd0NhbnZhcykge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlYnVnJykuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5hcnlDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJvdW5kaW5nIGJveCB3aGljaCBlbmNsb3NlcyBhbGwgdGhlIGdpdmVuIHBhdGNoZXNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWluaW1hbCBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBwcml2YXRlIF9ib3hGcm9tUGF0Y2hlcyhwYXRjaGVzOiBBcnJheTxQYXRjaD4pOiBCb3gge1xuICAgICAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5fY29uZmlnLmRlYnVnO1xuICAgICAgICBsZXQgYXZlcmFnZVJhZCA9IHBhdGNoZXMucmVkdWNlKChzdW0sIHsgcG9zLCByYWQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dQYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gZHJhdyBhbGwgcGF0Y2hlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1JlY3QocG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgJ3JlZCcsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc3VtICsgcmFkO1xuICAgICAgICB9LCAwKSAvIHBhdGNoZXMubGVuZ3RoO1xuXG4gICAgICAgIGF2ZXJhZ2VSYWQgPSAoYXZlcmFnZVJhZCAqIDE4MCAvIE1hdGguUEkgKyA5MCkgJSAxODAgLSA5MDtcbiAgICAgICAgaWYgKGF2ZXJhZ2VSYWQgPCAwKSB7XG4gICAgICAgICAgICBhdmVyYWdlUmFkICs9IDE4MDtcbiAgICAgICAgfVxuICAgICAgICBhdmVyYWdlUmFkID0gKDE4MCAtIGF2ZXJhZ2VSYWQpICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhdmVyYWdlUmFkKTtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYXZlcmFnZVJhZCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoW2Nvcywgc2luLCAtc2luLCBjb3NdKTtcbiAgICAgICAgY29uc3QgaW52ZXJzZU1hdHJpeCA9IGludmVydChtYXRyaXgpO1xuXG4gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBwYXRjaGVzIGFuZCByb3RhdGUgYnkgYW5nbGVcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKCh7IGJveCB9KSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgIGJveFtqXSA9IHRyYW5zZm9ybVdpdGhNYXRyaXgoYm94W2pdLCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd1RyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1BhdGgoYm94LCAnIzk5ZmYwMCcsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgbWluWCA9IHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLng7XG4gICAgICAgIGxldCBtaW5ZID0gdGhpcy5fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICAgICAgbGV0IG1heFggPSAtbWluWDtcbiAgICAgICAgbGV0IG1heFkgPSAtbWluWTtcblxuICAgICAgICAvLyBmaW5kIGJvdW5kaW5nIGJveFxuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHsgYm94IH0pID0+IHtcbiAgICAgICAgICAgIGJveC5mb3JFYWNoKCh7IHgsIHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4IDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHggPiBtYXhYKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFggPSB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh5ID4gbWF4WSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGJveDogQm94ID0gW3sgeDogbWluWCwgeTogbWluWSB9LCB7IHg6IG1heFgsIHk6IG1pblkgfSwgeyB4OiBtYXhYLCB5OiBtYXhZIH0sIHsgeDogbWluWCwgeTogbWF4WSB9XTtcblxuICAgICAgICBpZiAoZGVidWcgJiYgZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd1RyYW5zZm9ybWVkQm94KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UGF0aChib3gsICcjZmYwMDAwJywgMik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXZlcnNlIHJvdGF0aW9uXG4gICAgICAgIGJveCA9IGJveC5tYXAodmVydGV4ID0+IHRyYW5zZm9ybVdpdGhNYXRyaXgodmVydGV4LCBpbnZlcnNlTWF0cml4KSkgYXMgQm94O1xuXG4gICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93QkIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdQYXRoKGJveCwgJyNmZjAwMDAnLCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaGFsZlNhbXBsZSkge1xuICAgICAgICAgICAgLy8gc2NhbGVcbiAgICAgICAgICAgIGJveCA9IGJveC5tYXAoKHsgeCwgeSB9KSA9PiAoeyB4OiB4ICogMiwgeTogeSAqPSAyIH0pKSBhcyBCb3g7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm94O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiaW5hcnkgaW1hZ2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIF9iaW5hcml6ZUltYWdlKCk6IHZvaWQge1xuICAgICAgICBvdHN1VGhyZXNob2xkKHRoaXMuX2N1cnJlbnRJbWFnZVdyYXBwZXIsIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlcik7XG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci56ZXJvQm9yZGVyKCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5fY29uZmlnLmRlYnVnICYmIHRoaXMuX2NvbmZpZy5kZWJ1Zy5zaG93Q2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5hcnlJbWFnZVdyYXBwZXIuc2hvdyh0aGlzLl9iaW5hcnlDb250ZXh0LCAyNTUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgaW1hZ2UsIGV4dHJhY3QgcGF0Y2hlc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRQYXRjaGVzKCk6IEFycmF5PFBhdGNoPiB7XG4gICAgICAgIGNvbnN0IGRlYnVnID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWc7XG4gICAgICAgIGxldCBwYXRjaGVzRm91bmQgPSBuZXcgQXJyYXk8UGF0Y2g+KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9udW1QYXRjaGVzLng7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9udW1QYXRjaGVzLnk7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54ICogaTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5fc3ViSW1hZ2VXcmFwcGVyLnNpemUueSAqIGo7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXBlcmF0ZSBwYXJ0c1xuICAgICAgICAgICAgICAgIHRoaXMuX3NrZWxldG9uaXplKHgsIHkpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmFzdGVyaXplLCBmaW5kIGluZGl2aWR1YWwgYmFyc1xuICAgICAgICAgICAgICAgIHRoaXMuX3NrZWxJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsSW1hZ2VXcmFwcGVyLmRhdGEuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCByYXN0ZXJpemVyID0gbmV3IFJhc3Rlcml6ZXIodGhpcy5fc2tlbEltYWdlV3JhcHBlciwgdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhc3RlclJlc3VsdCA9IHJhc3Rlcml6ZXIucmFzdGVyaXplKDApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnLnNob3dMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIub3ZlcmxheSh0aGlzLl9iaW5hcnlDb250ZXh0LCAzNjAgLyByYXN0ZXJSZXN1bHQuY291bnQgfCAwLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbW9tZW50cyBmcm9tIHRoZSBza2VsZXRvbml6ZWQgcGF0Y2hcbiAgICAgICAgICAgICAgICBjb25zdCBtb21lbnRzID0gdGhpcy5fbGFiZWxJbWFnZVdyYXBwZXIubW9tZW50cyhyYXN0ZXJSZXN1bHQuY291bnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBlbGlnaWJsZSBwYXRjaGVzXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0Y2ggPSB0aGlzLl9kZXNjcmliZVBhdGNoKG1vbWVudHMsIGogKiB0aGlzLl9udW1QYXRjaGVzLnggKyBpLCB4LCB5KTtcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hlc0ZvdW5kLnB1c2gocGF0Y2gpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5zaG93Rm91bmRQYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3UmVjdChwYXRjaC5wb3MsIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLCAnIzk5ZmYwMCcsIDIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aG9zZSBjb25uZWN0ZWQgYXJlYXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCA2IHBhdGNoZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVtIG9yZGVyZWQgREVTQyBieSB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lZCBwYXRjaGVzXG4gICAgICogQHBhcmFtIG1heExhYmVsXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyhtYXhMYWJlbDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIGxldCBsYWJlbEhpc3QgPSBuZXcgQXJyYXk8bnVtYmVyPihtYXhMYWJlbCkuZmlsbCgwKTtcblxuICAgICAgICB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmZvckVhY2goKGRhdGE6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxIaXN0W2RhdGEgLSAxXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBleHRyYWN0IHRvcCBhcmVhcyB3aXRoIGF0IGxlYXN0IDYgcGF0Y2hlcyBwcmVzZW50XG4gICAgICAgIGNvbnN0IHRvcExhYmVscyA9IGxhYmVsSGlzdC5tYXAoKHZhbHVlLCBpbmRleCkgPT4gKHsgdmFsdWUsIGluZGV4IH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB2YWx1ZSA+PSA1KS5zb3J0KChhLCBiKSA9PiBiLnZhbHVlIC0gYS52YWx1ZSkubWFwKCh7IGluZGV4IH0pID0+IGluZGV4ICsgMSk7XG5cbiAgICAgICAgcmV0dXJuIHRvcExhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRCb3hlcyh0b3BMYWJlbHM6IEFycmF5PG51bWJlcj4sIG1heExhYmVsOiBudW1iZXIpOiBBcnJheTxCb3g+IHtcbiAgICAgICAgY29uc3QgYm94ZXMgPSBuZXcgQXJyYXk8Qm94PigpO1xuICAgICAgICBjb25zdCBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuZGVidWcgJiYgdGhpcy5fY29uZmlnLmRlYnVnLnNob3dSZW1haW5pbmdQYXRjaExhYmVscztcblxuICAgICAgICB0b3BMYWJlbHMuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRjaGVzID0gbmV3IEFycmF5PFBhdGNoPigpO1xuXG4gICAgICAgICAgICB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmZvckVhY2goKGRhdGE6IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2godGhpcy5faW1hZ2VUb1BhdGNoR3JpZFtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBib3ggPSB0aGlzLl9ib3hGcm9tUGF0Y2hlcyhwYXRjaGVzKTtcblxuICAgICAgICAgICAgaWYgKGJveCkge1xuICAgICAgICAgICAgICAgIGJveGVzLnB1c2goYm94KTtcblxuICAgICAgICAgICAgICAgIGlmIChzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhzdjogSFNWID0gWyhsYWJlbCAvIChtYXhMYWJlbCArIDEpKSAqIDM2MCwgMSwgMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJnYjogUkdCID0gWzAsIDAsIDBdO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IGByZ2IoJHtyZ2Iuam9pbignLCcpfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoZXMuZm9yRWFjaCgoeyBwb3MgfSkgPT4gdGhpcy5fZHJhd1JlY3QocG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgY29sb3IsIDIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHNpbWlsYXIgbW9tZW50cyAodmlhIGNsdXN0ZXIpXG4gICAgICogQHBhcmFtIG1vbWVudHNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaW1pbGFyTW9tZW50cyhtb21lbnRzOiBBcnJheTxNb21lbnQ+KTogQXJyYXk8TW9tZW50PiB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gQ2x1c3Rlci5jbHVzdGVyaXplKG1vbWVudHMsIE1vbWVudFNpbWlsYXJpdHlUaHJlc2hvbGQpO1xuICAgICAgICBjb25zdCB0b3BDbHVzdGVyID0gY2x1c3RlcnMucmVkdWNlKCh0b3AsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5tb21lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBjb3VudCA+IHRvcC5jb3VudCA/IHsgaXRlbSwgY291bnQgfSA6IHRvcDtcbiAgICAgICAgfSwgeyBpdGVtOiB7IG1vbWVudHM6IFtdIH0sIGNvdW50OiAwIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0b3BDbHVzdGVyLml0ZW0ubW9tZW50cztcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NrZWxldG9uaXplKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2JpbmFyeUltYWdlV3JhcHBlci5zdWJJbWFnZUFzQ29weSh0aGlzLl9zdWJJbWFnZVdyYXBwZXIsIHgsIHkpO1xuICAgICAgICB0aGlzLl9za2VsZXRvbml6ZXIuc2tlbGV0b25pemUoKTtcblxuICAgICAgICAvLyBTaG93IHNrZWxldG9uIGlmIHJlcXVlc3RlZFxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGlzLl9jb25maWcuZGVidWcgJiYgdGhpcy5fY29uZmlnLmRlYnVnLnNob3dTa2VsZXRvbikge1xuICAgICAgICAgICAgdGhpcy5fc2tlbEltYWdlV3JhcHBlci5vdmVybGF5KHRoaXMuX2JpbmFyeUNvbnRleHQsIDM2MCwgeCwgeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhbmQgZGVzY3JpYmVzIHRob3NlIHBhdGNoZXMgd2hpY2ggc2VlbSB0byBjb250YWluIGEgYmFyY29kZSBwYXR0ZXJuXG4gICAgICogQHBhcmFtIG1vbWVudHNcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcGFyYW0geFxuICAgICAqIEBwYXJhbSB5XG4gICAgICogQHJldHVybnMgbGlzdCBvZiBwYXRjaGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVzY3JpYmVQYXRjaChtb21lbnRzOiBBcnJheTxNb21lbnQ+LCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IFBhdGNoIHtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgbWluQ29tcG9uZW50V2VpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX3BhdGNoU2l6ZS54IC8gMyk7XG4gICAgICAgICAgICAvLyBvbmx5IGNvbGxlY3QgbW9tZW50cyB3aGljaCBhcmVhIGNvdmVycyBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHQgcGl4ZWxzXG4gICAgICAgICAgICBjb25zdCBlbGlnaWJsZU1vbWVudHMgPSBtb21lbnRzLmZpbHRlcihtb21lbnQgPT4gbW9tZW50Lm0wMCA+IG1pbkNvbXBvbmVudFdlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIGlmIGF0IGxlYXN0IDIgbW9tZW50cyBhcmUgZm91bmQgd2hpY2ggaGF2ZSBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHRzIGNvdmVyZWRcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZU1vbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nTW9tZW50cyA9IHRoaXMuX3NpbWlsYXJNb21lbnRzKGVsaWdpYmxlTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbWF0Y2hpbmdNb21lbnRzLmxlbmd0aCB8IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IHR3byBvZiB0aGUgbW9tZW50cyBhcmUgYWxsb3dlZCBub3QgdG8gZml0IGludG8gdGhlIGVxdWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgKGxlbmd0aCA8PCAyKSA+PSBlbGlnaWJsZU1vbWVudHMubGVuZ3RoICogMyAmJiAobGVuZ3RoIDw8IDIpID4gbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBzaW1pbGFyaXR5IG9mIHRoZSBtb21lbnRzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZCA9IG1hdGNoaW5nTW9tZW50cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBtb21lbnQ6IE1vbWVudCkgPT4gc3VtICsgbW9tZW50LnJhZCwgMCkgLyBsZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiB7IHgsIHkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeCwgeSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeDogeCArIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLngsIHkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHg6IHggKyB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54LCB5OiB5ICsgdGhpcy5fc3ViSW1hZ2VXcmFwcGVyLnNpemUueSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeCwgeTogeSArIHRoaXMuX3N1YkltYWdlV3JhcHBlci5zaXplLnkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudHM6IG1hdGNoaW5nTW9tZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IE1hdGguY29zKHJhZCksXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnNpbihyYWQpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbm90WWV0UHJvY2Vzc2VkKCk6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaV0gPT09IDAgJiYgdGhpcy5fcGF0Y2hHcmlkLmRhdGFbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdHJhY2UoY3VycmVudEluZGV4OiBudW1iZXIsIGxhYmVsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMC45NTtcbiAgICAgICAgY29uc3QgY3VycmVudDogUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBjdXJyZW50SW5kZXggJSB0aGlzLl9wYXRjaExhYmVsR3JpZC5zaXplLngsXG4gICAgICAgICAgICB5OiAoY3VycmVudEluZGV4IC8gdGhpcy5fcGF0Y2hMYWJlbEdyaWQuc2l6ZS54KSB8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRjaCA9IHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIC8vIGFzc2lnbiBsYWJlbFxuICAgICAgICAgICAgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtjdXJyZW50SW5kZXhdID0gbGFiZWw7XG5cbiAgICAgICAgICAgIFNlYXJjaERpcmVjdGlvbnMuZm9yRWFjaChkaXJlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjdXJyZW50LnkgKyBkaXJlY3Rpb25bMF07XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IGN1cnJlbnQueCArIGRpcmVjdGlvblsxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHkgKiB0aGlzLl9wYXRjaExhYmVsR3JpZC5zaXplLnggKyB4O1xuXG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgaWYgcGF0Y2ggZW1wdHlcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGF0Y2hHcmlkLmRhdGFbaW5kZXhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaW5kZXhdID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGFbaW5kZXhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gdGhpcy5faW1hZ2VUb1BhdGNoR3JpZFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSBNYXRoLmFicyhwYXRjaC54ICogY3VycmVudFBhdGNoLnggKyBwYXRjaC55ICogY3VycmVudFBhdGNoLnkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2UoaW5kZXgsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgcGF0Y2hlcyB3aGljaCBhcmUgY29ubmVjdGVkIGFuZCBzaGFyZSB0aGUgc2FtZSBvcmllbnRhdGlvblxuICAgICAqIEBwYXJhbSBwYXRjaGVzRm91bmRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yYXN0ZXJpemVBbmd1bGFyU2ltaWxhcml0eShwYXRjaGVzRm91bmQ6IEFycmF5PFBhdGNoPik6IG51bWJlciB7XG4gICAgICAgIGxldCBsYWJlbCA9IDA7XG4gICAgICAgIGNvbnN0IGhzdjogSFNWID0gWzAsIDEsIDFdO1xuICAgICAgICBjb25zdCByZ2I6IFJHQiA9IFswLCAwLCAwXTtcblxuICAgICAgICAvLyBwcmVwYXJlIGZvciBmaW5kaW5nIHRoZSByaWdodCBwYXRjaGVzXG4gICAgICAgIHRoaXMuX3BhdGNoR3JpZC5kYXRhLmZpbGwoMCk7XG4gICAgICAgIHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGEuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5faW1hZ2VUb1BhdGNoR3JpZC5maWxsKG51bGwpO1xuXG4gICAgICAgIHBhdGNoZXNGb3VuZC5mb3JFYWNoKHBhdGNoID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbcGF0Y2guaW5kZXhdID0gcGF0Y2g7XG4gICAgICAgICAgICB0aGlzLl9wYXRjaEdyaWQuZGF0YVtwYXRjaC5pbmRleF0gPSAxO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyByYXN0ZXJpemUgdGhlIHBhdGNoZXMgZm91bmQgdG8gZGV0ZXJtaW5lIGFyZWFcbiAgICAgICAgdGhpcy5fcGF0Y2hHcmlkLnplcm9Cb3JkZXIoKTtcblxuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKChjdXJyZW50SW5kZXggPSB0aGlzLl9ub3RZZXRQcm9jZXNzZWQoKSkgPCB0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbGFiZWwrKztcbiAgICAgICAgICAgIHRoaXMuX3RyYWNlKGN1cnJlbnRJbmRleCwgbGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHRoaXMuX2NvbmZpZy5kZWJ1ZyAmJiB0aGlzLl9jb25maWcuZGVidWcuc2hvd1BhdGNoTGFiZWxzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA+IDAgJiYgdGhpcy5fcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA8PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRjaCA9IHRoaXMuX2ltYWdlVG9QYXRjaEdyaWRbal07XG4gICAgICAgICAgICAgICAgICAgIGhzdlswXSA9ICh0aGlzLl9wYXRjaExhYmVsR3JpZC5kYXRhW2pdIC8gKGxhYmVsICsgMSkpICogMzYwO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1JlY3QocGF0Y2gucG9zLCB0aGlzLl9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgYHJnYigke3JnYi5qb2luKCcsJyl9KWAsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kcmF3UmVjdCh7IHgsIHkgfTogUG9pbnQsIHNpemU6IFBvaW50LCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9iaW5hcnlDb250ZXh0LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoIHx8IDE7XG4gICAgICAgIHRoaXMuX2JpbmFyeUNvbnRleHQuc3Ryb2tlUmVjdCh4LCB5LCBzaXplLngsIHNpemUueSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhd1BhdGgocGF0aDogQXJyYXk8UG9pbnQ+LCBjb2xvcjogc3RyaW5nLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKHBhdGgsIHRoaXMuX2JpbmFyeUNvbnRleHQsIGNvbG9yLCBsaW5lV2lkdGgpO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/env/development.js b/env/development.js
deleted file mode 100644
index 2f3a3f5f..00000000
--- a/env/development.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- production: false,
- development: true,
- node: false
-};
diff --git a/env/node.js b/env/node.js
deleted file mode 100644
index b5f04958..00000000
--- a/env/node.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- production: true,
- development: false,
- node: true
-};
diff --git a/env/production.js b/env/production.js
deleted file mode 100644
index 08f6692d..00000000
--- a/env/production.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- production: true,
- development: false,
- node: false
-};
diff --git a/example/camera_example.html b/example/camera_example.html
index 55120795..d4d3a78e 100644
--- a/example/camera_example.html
+++ b/example/camera_example.html
@@ -1,83 +1,82 @@
-
-
-
- Camera
-
+
-
-
-
+
+
-