@esotericsoftware/spine-core 4.3.9 → 4.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Skeleton.d.ts +1 -1
- package/dist/Skeleton.js +1 -1
- package/dist/SkeletonClipping.js +40 -23
- package/dist/SkeletonCoordinateConverter.d.ts +57 -0
- package/dist/SkeletonCoordinateConverter.js +30 -0
- package/dist/SkeletonData.d.ts +1 -1
- package/dist/SkeletonData.js +1 -1
- package/dist/SkeletonPhysicsMovement.d.ts +134 -0
- package/dist/SkeletonPhysicsMovement.js +189 -0
- package/dist/SkeletonRendererCore.js +15 -5
- package/dist/esm/spine-core.min.mjs +2 -2
- package/dist/esm/spine-core.mjs +198 -24
- package/dist/esm/spine-core.mjs.map +3 -3
- package/dist/iife/spine-core.js +198 -24
- package/dist/iife/spine-core.js.map +3 -3
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import type { Bone } from "./Bone.js";
|
|
30
|
+
/** Converts points between Spine skeleton coordinates and host runtime game coordinates. */
|
|
31
|
+
export interface SkeletonCoordinateConverter {
|
|
32
|
+
/**
|
|
33
|
+
* Converts `point` in-place from skeleton coordinates to host runtime game coordinates.
|
|
34
|
+
* @param point The point to convert.
|
|
35
|
+
*/
|
|
36
|
+
skeletonToGame(point: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
}): void;
|
|
40
|
+
/**
|
|
41
|
+
* Converts `point` in-place from host runtime game coordinates to skeleton coordinates.
|
|
42
|
+
* @param point The point to convert.
|
|
43
|
+
*/
|
|
44
|
+
gameToSkeleton(point: {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
}): void;
|
|
48
|
+
/**
|
|
49
|
+
* Converts `point` in-place from host runtime game coordinates to the local coordinates of `bone`.
|
|
50
|
+
* @param point The point to convert.
|
|
51
|
+
* @param bone The bone whose local coordinates should receive the converted point.
|
|
52
|
+
*/
|
|
53
|
+
gameToBone(point: {
|
|
54
|
+
x: number;
|
|
55
|
+
y: number;
|
|
56
|
+
}, bone: Bone): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Db29yZGluYXRlQ29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uQ29vcmRpbmF0ZUNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0UiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgQm9uZSB9IGZyb20gXCIuL0JvbmUuanNcIjtcblxuLyoqIENvbnZlcnRzIHBvaW50cyBiZXR3ZWVuIFNwaW5lIHNrZWxldG9uIGNvb3JkaW5hdGVzIGFuZCBob3N0IHJ1bnRpbWUgZ2FtZSBjb29yZGluYXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tlbGV0b25Db29yZGluYXRlQ29udmVydGVyIHtcblx0LyoqXG5cdCAqIENvbnZlcnRzIGBwb2ludGAgaW4tcGxhY2UgZnJvbSBza2VsZXRvbiBjb29yZGluYXRlcyB0byBob3N0IHJ1bnRpbWUgZ2FtZSBjb29yZGluYXRlcy5cblx0ICogQHBhcmFtIHBvaW50IFRoZSBwb2ludCB0byBjb252ZXJ0LlxuXHQgKi9cblx0c2tlbGV0b25Ub0dhbWUgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBgcG9pbnRgIGluLXBsYWNlIGZyb20gaG9zdCBydW50aW1lIGdhbWUgY29vcmRpbmF0ZXMgdG8gc2tlbGV0b24gY29vcmRpbmF0ZXMuXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQgdG8gY29udmVydC5cblx0ICovXG5cdGdhbWVUb1NrZWxldG9uIChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZDtcblxuXHQvKipcblx0ICogQ29udmVydHMgYHBvaW50YCBpbi1wbGFjZSBmcm9tIGhvc3QgcnVudGltZSBnYW1lIGNvb3JkaW5hdGVzIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiBgYm9uZWAuXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQgdG8gY29udmVydC5cblx0ICogQHBhcmFtIGJvbmUgVGhlIGJvbmUgd2hvc2UgbG9jYWwgY29vcmRpbmF0ZXMgc2hvdWxkIHJlY2VpdmUgdGhlIGNvbnZlcnRlZCBwb2ludC5cblx0ICovXG5cdGdhbWVUb0JvbmUgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIGJvbmU6IEJvbmUpOiB2b2lkO1xufVxuIl19
|
package/dist/SkeletonData.d.ts
CHANGED
|
@@ -103,5 +103,5 @@ export declare class SkeletonData {
|
|
|
103
103
|
findAnimation(animationName: string): Animation | null;
|
|
104
104
|
/** Finds a constraint of the specified type by comparing each constraints's name. It is more efficient to cache the results of
|
|
105
105
|
* this method than to call it multiple times. */
|
|
106
|
-
findConstraint<T extends ConstraintData<any, any>>(constraintName: string, type: new (
|
|
106
|
+
findConstraint<T extends ConstraintData<any, any>>(constraintName: string, type: abstract new (...args: any[]) => T): T | null;
|
|
107
107
|
}
|
package/dist/SkeletonData.js
CHANGED
|
@@ -164,4 +164,4 @@ export class SkeletonData {
|
|
|
164
164
|
return null;
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFRL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzdDOzs7WUFHWTtBQUNaLE1BQU0sT0FBTyxZQUFZO0lBRXhCLDZHQUE2RztJQUM3RyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQix5RkFBeUY7SUFDekYsS0FBSyxHQUFHLEVBQWdCLENBQUMsQ0FBQyx5QkFBeUI7SUFFbkQseURBQXlEO0lBQ3pELEtBQUssR0FBRyxFQUFnQixDQUFDLENBQUMseUJBQXlCO0lBRW5ELEtBQUssR0FBRyxFQUFZLENBQUM7SUFFckI7OztzQkFHa0I7SUFDbEIsV0FBVyxHQUFnQixJQUFJLENBQUM7SUFFaEMsNkJBQTZCO0lBQzdCLE1BQU0sR0FBRyxFQUFpQixDQUFDO0lBRTNCLGlDQUFpQztJQUNqQyxVQUFVLEdBQUcsRUFBaUIsQ0FBQztJQUUvQixxQ0FBcUM7SUFDckMsb0dBQW9HO0lBQ3BHLFdBQVcsR0FBRyxFQUFnQyxDQUFDO0lBRS9DLHNGQUFzRjtJQUN0RixDQUFDLEdBQVcsQ0FBQyxDQUFDO0lBRWQsc0ZBQXNGO0lBQ3RGLENBQUMsR0FBVyxDQUFDLENBQUM7SUFFZCwrRUFBK0U7SUFDL0UsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUVsQixnRkFBZ0Y7SUFDaEYsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUVuQjtpQkFDYTtJQUNiLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFFckIsbUVBQW1FO0lBQ25FLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBRTlCLDJHQUEyRztJQUMzRyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQixlQUFlO0lBQ2Ysc0ZBQXNGO0lBQ3RGLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCww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TyxVQUFlLENBQUM7UUFDOUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEFuaW1hdGlvbiB9IGZyb20gXCIuL0FuaW1hdGlvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmVEYXRhIH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9Db25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudERhdGEgfSBmcm9tIFwiLi9FdmVudERhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tpbiB9IGZyb20gXCIuL1NraW4uanNcIjtcbmltcG9ydCB7IFNsaWRlckRhdGEgfSBmcm9tIFwiLi9TbGlkZXJEYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3REYXRhIH0gZnJvbSBcIi4vU2xvdERhdGEuanNcIjtcblxuLyoqIFN0b3JlcyB0aGUgc2V0dXAgcG9zZSBhbmQgYWxsIG9mIHRoZSBzdGF0ZWxlc3MgZGF0YSBmb3IgYSBza2VsZXRvbi5cbiAqXG4gKiBTZWUgW0RhdGEgb2JqZWN0c10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtYXJjaGl0ZWN0dXJlI0RhdGEtb2JqZWN0cykgaW4gdGhlIFNwaW5lIFJ1bnRpbWVzXG4gKiBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkRhdGEge1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBuYW1lLCB3aGljaCBieSBkZWZhdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBza2VsZXRvbiBkYXRhIGZpbGUsIGlmIHBvc3NpYmxlLiBNYXkgYmUgbnVsbC4gKi9cblx0bmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGJvbmVzLCBzb3J0ZWQgcGFyZW50IGZpcnN0LiBUaGUgcm9vdCBib25lIGlzIGFsd2F5cyB0aGUgZmlyc3QgYm9uZS4gKi9cblx0Ym9uZXMgPSBbXSBhcyBCb25lRGF0YVtdOyAvLyBPcmRlcmVkIHBhcmVudHMgZmlyc3QuXG5cblx0LyoqIFRoZSBza2VsZXRvbidzIHNsb3RzIGluIHRoZSBzZXR1cCBwb3NlIGRyYXcgb3JkZXIuICovXG5cdHNsb3RzID0gW10gYXMgU2xvdERhdGFbXTsgLy8gU2V0dXAgcG9zZSBkcmF3IG9yZGVyLlxuXG5cdHNraW5zID0gW10gYXMgU2tpbltdO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBkZWZhdWx0IHNraW4uIEJ5IGRlZmF1bHQgdGhpcyBza2luIGNvbnRhaW5zIGFsbCBhdHRhY2htZW50cyB0aGF0IHdlcmUgbm90IGluIGEgc2tpbiBpbiBTcGluZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBTa2VsZXRvbi5nZXRBdHRhY2htZW50QnlOYW1lfS5cblx0ICogTWF5IGJlIG51bGwuICovXG5cdGRlZmF1bHRTa2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGV2ZW50cy4gKi9cblx0ZXZlbnRzID0gW10gYXMgRXZlbnREYXRhW107XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGFuaW1hdGlvbnMuICovXG5cdGFuaW1hdGlvbnMgPSBbXSBhcyBBbmltYXRpb25bXTtcblxuXHQvKiogVGhlIHNrZWxldG9uJ3MgSUsgY29uc3RyYWludHMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0Y29uc3RyYWludHMgPSBbXSBhcyBDb25zdHJhaW50RGF0YTxhbnksIGFueT5bXTtcblxuXHQvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR4OiBudW1iZXIgPSAwO1xuXG5cdC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBza2VsZXRvbidzIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggaW4gdGhlIHNldHVwIHBvc2UuICovXG5cdHk6IG51bWJlciA9IDA7XG5cblx0LyoqIFRoZSB3aWR0aCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR3aWR0aDogbnVtYmVyID0gMDtcblxuXHQvKiogVGhlIGhlaWdodCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHRoZWlnaHQ6IG51bWJlciA9IDA7XG5cblx0LyoqIEJhc2VsaW5lIHNjYWxlIGZhY3RvciBmb3IgYXBwbHlpbmcgZGlzdGFuY2UtZGVwZW5kZW50IGVmZmVjdHMgb24gbm9uLXNjYWxhYmxlIHByb3BlcnRpZXMsIHN1Y2ggYXMgYW5nbGUgb3Igc2NhbGUuIERlZmF1bHRcblx0ICogaXMgMTAwLiAqL1xuXHRyZWZlcmVuY2VTY2FsZSA9IDEwMDtcblxuXHQvKiogVGhlIFNwaW5lIHZlcnNpb24gdXNlZCB0byBleHBvcnQgdGhlIHNrZWxldG9uIGRhdGEsIG9yIG51bGwuICovXG5cdHZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24gZGF0YSBoYXNoLiBUaGlzIHZhbHVlIHdpbGwgY2hhbmdlIGlmIGFueSBvZiB0aGUgc2tlbGV0b24gZGF0YSBoYXMgY2hhbmdlZC4gTWF5IGJlIG51bGwuICovXG5cdGhhc2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8vIE5vbmVzc2VudGlhbFxuXHQvKiogVGhlIGRvcGVzaGVldCBGUFMgaW4gU3BpbmUuIEF2YWlsYWJsZSBvbmx5IHdoZW4gbm9uZXNzZW50aWFsIGRhdGEgd2FzIGV4cG9ydGVkLiAqL1xuXHRmcHMgPSAzMDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGltYWdlcyBmb2xkZXIgYXMgZGVmaW5lZCBpbiBTcGluZS4gQXZhaWxhYmxlIG9ubHkgd2hlbiBub25lc3NlbnRpYWwgZGF0YSB3YXMgZXhwb3J0ZWQuIE1heSBiZSBudWxsLiAqL1xuXHRpbWFnZXNQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGF1ZGlvIGZvbGRlciBhcyBkZWZpbmVkIGluIFNwaW5lLiBBdmFpbGFibGUgb25seSB3aGVuIG5vbmVzc2VudGlhbCBkYXRhIHdhcyBleHBvcnRlZC4gTWF5IGJlIG51bGwuICovXG5cdGF1ZGlvUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIEZpbmRzIGEgYm9uZSBieSBjb21wYXJpbmcgZWFjaCBib25lJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0byBjYWxsIGl0XG5cdCAqIG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEJvbmUgKGJvbmVOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIWJvbmVOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJib25lTmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0aWYgKGJvbmVzW2ldLm5hbWUgPT09IGJvbmVOYW1lKSByZXR1cm4gYm9uZXNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogRmluZHMgYSBzbG90IGJ5IGNvbXBhcmluZyBlYWNoIHNsb3QncyBuYW1lLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXRcblx0ICogbXVsdGlwbGUgdGltZXMuXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRmaW5kU2xvdCAoc2xvdE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghc2xvdE5hbWUpIHRocm93IG5ldyBFcnJvcihcInNsb3ROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2xvdHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoc2xvdHNbaV0ubmFtZSA9PT0gc2xvdE5hbWUpIHJldHVybiBzbG90c1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBGaW5kcyBhIHNraW4gYnkgY29tcGFyaW5nIGVhY2ggc2tpbidzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRTa2luIChza2luTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFza2luTmFtZSkgdGhyb3cgbmV3IEVycm9yKFwic2tpbk5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHNraW5zID0gdGhpcy5za2lucztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNraW5zLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGlmIChza2luc1tpXS5uYW1lID09PSBza2luTmFtZSkgcmV0dXJuIHNraW5zW2ldO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGFuIGV2ZW50IGJ5IGNvbXBhcmluZyBlYWNoIGV2ZW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRFdmVudCAoZXZlbnREYXRhTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFldmVudERhdGFOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJldmVudERhdGFOYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGV2ZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoZXZlbnRzW2ldLm5hbWUgPT09IGV2ZW50RGF0YU5hbWUpIHJldHVybiBldmVudHNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogQ29sbGVjdHMgYW5pbWF0aW9ucyB1c2VkIGJ5IHtAbGluayBTbGlkZXJEYXRhIHNsaWRlciBjb25zdHJhaW50c30uXG5cdCAqXG5cdCAqIFNsaWRlciBhbmltYXRpb25zIGFyZSBkZXNpZ25lZCB0byBiZSBhcHBsaWVkIGJ5IHNsaWRlciBjb25zdHJhaW50cyByYXRoZXIgdGhhbiBvbiB0aGVpciBvd24uIEFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgYSB1c2VyXG5cdCAqIGNob29zZSBhbiBhbmltYXRpb24gbWF5IHdhbnQgdG8gZXhjbHVkZSB0aGVtLiAqL1xuXHRmaW5kU2xpZGVyQW5pbWF0aW9ucyAoYW5pbWF0aW9uczogQW5pbWF0aW9uW10pOiBBbmltYXRpb25bXSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSB0aGlzLmNvbnN0cmFpbnRzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBjb25zdHJhaW50c1tpXTtcblx0XHRcdGlmIChkYXRhIGluc3RhbmNlb2YgU2xpZGVyRGF0YSAmJiBkYXRhLmFuaW1hdGlvbiAhPSBudWxsKSBhbmltYXRpb25zLnB1c2goZGF0YS5hbmltYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblx0fVxuXG5cdC8qKiBGaW5kcyBhbiBhbmltYXRpb24gYnkgY29tcGFyaW5nIGVhY2ggYW5pbWF0aW9uJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0b1xuXHQgKiBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEFuaW1hdGlvbiAoYW5pbWF0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFhbmltYXRpb25OYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJhbmltYXRpb25OYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYW5pbWF0aW9ucy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5uYW1lID09PSBhbmltYXRpb25OYW1lKSByZXR1cm4gYW5pbWF0aW9uc1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIC0tLSBDb25zdHJhaW50cy5cblxuXHQvKiogRmluZHMgYSBjb25zdHJhaW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBieSBjb21wYXJpbmcgZWFjaCBjb25zdHJhaW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mXG5cdCAgKiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0ZmluZENvbnN0cmFpbnQ8VCBleHRlbmRzIENvbnN0cmFpbnREYXRhPGFueSwgYW55Pj4gKGNvbnN0cmFpbnROYW1lOiBzdHJpbmcsIHR5cGU6IG5ldyAobmFtZTogc3RyaW5nKSA9PiBUKTogVCB8IG51bGwge1xuXHRcdGlmICghY29uc3RyYWludE5hbWUpIHRocm93IG5ldyBFcnJvcihcImNvbnN0cmFpbnROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRpZiAodHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldO1xuXHRcdFx0aWYgKGNvbnN0cmFpbnQgaW5zdGFuY2VvZiB0eXBlICYmIGNvbnN0cmFpbnQubmFtZSA9PT0gY29uc3RyYWludE5hbWUpIHJldHVybiBjb25zdHJhaW50IGFzIFQ7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cbn1cbiJdfQ==
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFRL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzdDOzs7WUFHWTtBQUNaLE1BQU0sT0FBTyxZQUFZO0lBRXhCLDZHQUE2RztJQUM3RyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQix5RkFBeUY7SUFDekYsS0FBSyxHQUFHLEVBQWdCLENBQUMsQ0FBQyx5QkFBeUI7SUFFbkQseURBQXlEO0lBQ3pELEtBQUssR0FBRyxFQUFnQixDQUFDLENBQUMseUJBQXlCO0lBRW5ELEtBQUssR0FBRyxFQUFZLENBQUM7SUFFckI7OztzQkFHa0I7SUFDbEIsV0FBVyxHQUFnQixJQUFJLENBQUM7SUFFaEMsNkJBQTZCO0lBQzdCLE1BQU0sR0FBRyxFQUFpQixDQUFDO0lBRTNCLGlDQUFpQztJQUNqQyxVQUFVLEdBQUcsRUFBaUIsQ0FBQztJQUUvQixxQ0FBcUM7SUFDckMsb0dBQW9HO0lBQ3BHLFdBQVcsR0FBRyxFQUFnQyxDQUFDO0lBRS9DLHNGQUFzRjtJQUN0RixDQUFDLEdBQVcsQ0FBQyxDQUFDO0lBRWQsc0ZBQXNGO0lBQ3RGLENBQUMsR0FBVyxDQUFDLENBQUM7SUFFZCwrRUFBK0U7SUFDL0UsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUVsQixnRkFBZ0Y7SUFDaEYsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUVuQjtpQkFDYTtJQUNiLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFFckIsbUVBQW1FO0lBQ25FLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBRTlCLDJHQUEyRztJQUMzRyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQixlQUFlO0lBQ2Ysc0ZBQXNGO0lBQ3RGLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCww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TyxVQUFlLENBQUM7UUFDOUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEFuaW1hdGlvbiB9IGZyb20gXCIuL0FuaW1hdGlvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmVEYXRhIH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9Db25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudERhdGEgfSBmcm9tIFwiLi9FdmVudERhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tpbiB9IGZyb20gXCIuL1NraW4uanNcIjtcbmltcG9ydCB7IFNsaWRlckRhdGEgfSBmcm9tIFwiLi9TbGlkZXJEYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3REYXRhIH0gZnJvbSBcIi4vU2xvdERhdGEuanNcIjtcblxuLyoqIFN0b3JlcyB0aGUgc2V0dXAgcG9zZSBhbmQgYWxsIG9mIHRoZSBzdGF0ZWxlc3MgZGF0YSBmb3IgYSBza2VsZXRvbi5cbiAqXG4gKiBTZWUgW0RhdGEgb2JqZWN0c10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtYXJjaGl0ZWN0dXJlI0RhdGEtb2JqZWN0cykgaW4gdGhlIFNwaW5lIFJ1bnRpbWVzXG4gKiBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkRhdGEge1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBuYW1lLCB3aGljaCBieSBkZWZhdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBza2VsZXRvbiBkYXRhIGZpbGUsIGlmIHBvc3NpYmxlLiBNYXkgYmUgbnVsbC4gKi9cblx0bmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGJvbmVzLCBzb3J0ZWQgcGFyZW50IGZpcnN0LiBUaGUgcm9vdCBib25lIGlzIGFsd2F5cyB0aGUgZmlyc3QgYm9uZS4gKi9cblx0Ym9uZXMgPSBbXSBhcyBCb25lRGF0YVtdOyAvLyBPcmRlcmVkIHBhcmVudHMgZmlyc3QuXG5cblx0LyoqIFRoZSBza2VsZXRvbidzIHNsb3RzIGluIHRoZSBzZXR1cCBwb3NlIGRyYXcgb3JkZXIuICovXG5cdHNsb3RzID0gW10gYXMgU2xvdERhdGFbXTsgLy8gU2V0dXAgcG9zZSBkcmF3IG9yZGVyLlxuXG5cdHNraW5zID0gW10gYXMgU2tpbltdO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBkZWZhdWx0IHNraW4uIEJ5IGRlZmF1bHQgdGhpcyBza2luIGNvbnRhaW5zIGFsbCBhdHRhY2htZW50cyB0aGF0IHdlcmUgbm90IGluIGEgc2tpbiBpbiBTcGluZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBTa2VsZXRvbi5nZXRBdHRhY2htZW50QnlOYW1lfS5cblx0ICogTWF5IGJlIG51bGwuICovXG5cdGRlZmF1bHRTa2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGV2ZW50cy4gKi9cblx0ZXZlbnRzID0gW10gYXMgRXZlbnREYXRhW107XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGFuaW1hdGlvbnMuICovXG5cdGFuaW1hdGlvbnMgPSBbXSBhcyBBbmltYXRpb25bXTtcblxuXHQvKiogVGhlIHNrZWxldG9uJ3MgSUsgY29uc3RyYWludHMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0Y29uc3RyYWludHMgPSBbXSBhcyBDb25zdHJhaW50RGF0YTxhbnksIGFueT5bXTtcblxuXHQvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR4OiBudW1iZXIgPSAwO1xuXG5cdC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBza2VsZXRvbidzIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggaW4gdGhlIHNldHVwIHBvc2UuICovXG5cdHk6IG51bWJlciA9IDA7XG5cblx0LyoqIFRoZSB3aWR0aCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR3aWR0aDogbnVtYmVyID0gMDtcblxuXHQvKiogVGhlIGhlaWdodCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHRoZWlnaHQ6IG51bWJlciA9IDA7XG5cblx0LyoqIEJhc2VsaW5lIHNjYWxlIGZhY3RvciBmb3IgYXBwbHlpbmcgZGlzdGFuY2UtZGVwZW5kZW50IGVmZmVjdHMgb24gbm9uLXNjYWxhYmxlIHByb3BlcnRpZXMsIHN1Y2ggYXMgYW5nbGUgb3Igc2NhbGUuIERlZmF1bHRcblx0ICogaXMgMTAwLiAqL1xuXHRyZWZlcmVuY2VTY2FsZSA9IDEwMDtcblxuXHQvKiogVGhlIFNwaW5lIHZlcnNpb24gdXNlZCB0byBleHBvcnQgdGhlIHNrZWxldG9uIGRhdGEsIG9yIG51bGwuICovXG5cdHZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24gZGF0YSBoYXNoLiBUaGlzIHZhbHVlIHdpbGwgY2hhbmdlIGlmIGFueSBvZiB0aGUgc2tlbGV0b24gZGF0YSBoYXMgY2hhbmdlZC4gTWF5IGJlIG51bGwuICovXG5cdGhhc2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8vIE5vbmVzc2VudGlhbFxuXHQvKiogVGhlIGRvcGVzaGVldCBGUFMgaW4gU3BpbmUuIEF2YWlsYWJsZSBvbmx5IHdoZW4gbm9uZXNzZW50aWFsIGRhdGEgd2FzIGV4cG9ydGVkLiAqL1xuXHRmcHMgPSAzMDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGltYWdlcyBmb2xkZXIgYXMgZGVmaW5lZCBpbiBTcGluZS4gQXZhaWxhYmxlIG9ubHkgd2hlbiBub25lc3NlbnRpYWwgZGF0YSB3YXMgZXhwb3J0ZWQuIE1heSBiZSBudWxsLiAqL1xuXHRpbWFnZXNQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGF1ZGlvIGZvbGRlciBhcyBkZWZpbmVkIGluIFNwaW5lLiBBdmFpbGFibGUgb25seSB3aGVuIG5vbmVzc2VudGlhbCBkYXRhIHdhcyBleHBvcnRlZC4gTWF5IGJlIG51bGwuICovXG5cdGF1ZGlvUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIEZpbmRzIGEgYm9uZSBieSBjb21wYXJpbmcgZWFjaCBib25lJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0byBjYWxsIGl0XG5cdCAqIG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEJvbmUgKGJvbmVOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIWJvbmVOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJib25lTmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0aWYgKGJvbmVzW2ldLm5hbWUgPT09IGJvbmVOYW1lKSByZXR1cm4gYm9uZXNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogRmluZHMgYSBzbG90IGJ5IGNvbXBhcmluZyBlYWNoIHNsb3QncyBuYW1lLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXRcblx0ICogbXVsdGlwbGUgdGltZXMuXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRmaW5kU2xvdCAoc2xvdE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghc2xvdE5hbWUpIHRocm93IG5ldyBFcnJvcihcInNsb3ROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2xvdHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoc2xvdHNbaV0ubmFtZSA9PT0gc2xvdE5hbWUpIHJldHVybiBzbG90c1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBGaW5kcyBhIHNraW4gYnkgY29tcGFyaW5nIGVhY2ggc2tpbidzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRTa2luIChza2luTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFza2luTmFtZSkgdGhyb3cgbmV3IEVycm9yKFwic2tpbk5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHNraW5zID0gdGhpcy5za2lucztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNraW5zLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGlmIChza2luc1tpXS5uYW1lID09PSBza2luTmFtZSkgcmV0dXJuIHNraW5zW2ldO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGFuIGV2ZW50IGJ5IGNvbXBhcmluZyBlYWNoIGV2ZW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRFdmVudCAoZXZlbnREYXRhTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFldmVudERhdGFOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJldmVudERhdGFOYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGV2ZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoZXZlbnRzW2ldLm5hbWUgPT09IGV2ZW50RGF0YU5hbWUpIHJldHVybiBldmVudHNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogQ29sbGVjdHMgYW5pbWF0aW9ucyB1c2VkIGJ5IHtAbGluayBTbGlkZXJEYXRhIHNsaWRlciBjb25zdHJhaW50c30uXG5cdCAqXG5cdCAqIFNsaWRlciBhbmltYXRpb25zIGFyZSBkZXNpZ25lZCB0byBiZSBhcHBsaWVkIGJ5IHNsaWRlciBjb25zdHJhaW50cyByYXRoZXIgdGhhbiBvbiB0aGVpciBvd24uIEFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgYSB1c2VyXG5cdCAqIGNob29zZSBhbiBhbmltYXRpb24gbWF5IHdhbnQgdG8gZXhjbHVkZSB0aGVtLiAqL1xuXHRmaW5kU2xpZGVyQW5pbWF0aW9ucyAoYW5pbWF0aW9uczogQW5pbWF0aW9uW10pOiBBbmltYXRpb25bXSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSB0aGlzLmNvbnN0cmFpbnRzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBjb25zdHJhaW50c1tpXTtcblx0XHRcdGlmIChkYXRhIGluc3RhbmNlb2YgU2xpZGVyRGF0YSAmJiBkYXRhLmFuaW1hdGlvbiAhPSBudWxsKSBhbmltYXRpb25zLnB1c2goZGF0YS5hbmltYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblx0fVxuXG5cdC8qKiBGaW5kcyBhbiBhbmltYXRpb24gYnkgY29tcGFyaW5nIGVhY2ggYW5pbWF0aW9uJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0b1xuXHQgKiBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEFuaW1hdGlvbiAoYW5pbWF0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFhbmltYXRpb25OYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJhbmltYXRpb25OYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYW5pbWF0aW9ucy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5uYW1lID09PSBhbmltYXRpb25OYW1lKSByZXR1cm4gYW5pbWF0aW9uc1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIC0tLSBDb25zdHJhaW50cy5cblxuXHQvKiogRmluZHMgYSBjb25zdHJhaW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBieSBjb21wYXJpbmcgZWFjaCBjb25zdHJhaW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mXG5cdCAgKiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0ZmluZENvbnN0cmFpbnQ8VCBleHRlbmRzIENvbnN0cmFpbnREYXRhPGFueSwgYW55Pj4gKGNvbnN0cmFpbnROYW1lOiBzdHJpbmcsIHR5cGU6IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBUIHwgbnVsbCB7XG5cdFx0aWYgKCFjb25zdHJhaW50TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiY29uc3RyYWludE5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGlmICh0eXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInR5cGUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5jb25zdHJhaW50cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuY29uc3RyYWludHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb25zdHJhaW50ID0gY29uc3RyYWludHNbaV07XG5cdFx0XHRpZiAoY29uc3RyYWludCBpbnN0YW5jZW9mIHR5cGUgJiYgY29uc3RyYWludC5uYW1lID09PSBjb25zdHJhaW50TmFtZSkgcmV0dXJuIGNvbnN0cmFpbnQgYXMgVDtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxufVxuIl19
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import type { Skeleton } from "./Skeleton.js";
|
|
30
|
+
/** A host runtime object's world position and rotation used for skeleton physics movement inheritance. */
|
|
31
|
+
export interface SkeletonPhysicsMovementTransform {
|
|
32
|
+
/** The host object's X position in world coordinates. */
|
|
33
|
+
x: number;
|
|
34
|
+
/** The host object's Y position in world coordinates. */
|
|
35
|
+
y: number;
|
|
36
|
+
/** The host object's Z position in world coordinates. Set to `0` in 2D runtimes. */
|
|
37
|
+
z: number;
|
|
38
|
+
/** The host object's rotation around the skeleton plane normal, in degrees and in the direction expected by Spine physics. */
|
|
39
|
+
rotation: number;
|
|
40
|
+
}
|
|
41
|
+
/** Initial movement inheritance values for {@link SkeletonPhysicsMovement}. */
|
|
42
|
+
export interface SkeletonPhysicsMovementOptions {
|
|
43
|
+
/** Initial horizontal position inheritance. Defaults to `0`. */
|
|
44
|
+
positionInheritanceX?: number;
|
|
45
|
+
/** Initial vertical position inheritance. Defaults to `0`. */
|
|
46
|
+
positionInheritanceY?: number;
|
|
47
|
+
/** Initial rotation inheritance. Defaults to `0`. */
|
|
48
|
+
rotationInheritance?: number;
|
|
49
|
+
}
|
|
50
|
+
/** Runtime-specific hooks needed by {@link SkeletonPhysicsMovement}. */
|
|
51
|
+
export interface SkeletonPhysicsMovementAdapter {
|
|
52
|
+
/**
|
|
53
|
+
* Writes the current host object world position to `out` and, when `readRotation` is true, its rotation.
|
|
54
|
+
* Implementations may skip calculating and writing `out.rotation` when `readRotation` is false.
|
|
55
|
+
* @param out Receives the current host object transform.
|
|
56
|
+
* @param readRotation Whether the current rotation is needed.
|
|
57
|
+
*/
|
|
58
|
+
readTransform(out: SkeletonPhysicsMovementTransform, readRotation: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* Converts `point` in-place from host world coordinates to skeleton coordinates.
|
|
61
|
+
* The converted skeleton coordinates are returned in `point.x` and `point.y`.
|
|
62
|
+
*/
|
|
63
|
+
worldToSkeleton(point: {
|
|
64
|
+
x: number;
|
|
65
|
+
y: number;
|
|
66
|
+
z: number;
|
|
67
|
+
}): void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Tracks movement of a host runtime object and applies that movement to skeleton physics constraints.
|
|
71
|
+
*
|
|
72
|
+
* This is useful for runtimes where a Spine skeleton is displayed by a movable object or container.
|
|
73
|
+
* When enabled, changes in the host object's position are converted to skeleton coordinates and passed to
|
|
74
|
+
* {@link Skeleton.physicsTranslate}. Changes in its rotation are passed to {@link Skeleton.physicsRotate}.
|
|
75
|
+
*
|
|
76
|
+
* Movement inheritance is opt-in. Position and rotation inheritance default to `0`, so
|
|
77
|
+
* {@link applyTransformMovement} returns immediately until one of the inheritance values is non-zero.
|
|
78
|
+
*/
|
|
79
|
+
export declare class SkeletonPhysicsMovement {
|
|
80
|
+
private skeleton;
|
|
81
|
+
private adapter;
|
|
82
|
+
private positionInheritanceFactorX;
|
|
83
|
+
private positionInheritanceFactorY;
|
|
84
|
+
private rotationInheritanceFactor;
|
|
85
|
+
private hasLastTransform;
|
|
86
|
+
private lastX;
|
|
87
|
+
private lastY;
|
|
88
|
+
private lastZ;
|
|
89
|
+
private lastRotation;
|
|
90
|
+
private readonly currentTransform;
|
|
91
|
+
private readonly currentPosition;
|
|
92
|
+
private readonly lastPosition;
|
|
93
|
+
/**
|
|
94
|
+
* Creates a movement tracker for a skeleton displayed by a host runtime object.
|
|
95
|
+
* @param skeleton The skeleton whose physics constraints receive inherited movement.
|
|
96
|
+
* @param adapter Runtime-specific hooks used to read and convert the host object's transform.
|
|
97
|
+
* @param options Initial movement inheritance values.
|
|
98
|
+
*/
|
|
99
|
+
constructor(skeleton: Skeleton, adapter: SkeletonPhysicsMovementAdapter, options?: SkeletonPhysicsMovementOptions);
|
|
100
|
+
/** Horizontal position inheritance factor. `0` disables horizontal position inheritance. */
|
|
101
|
+
get positionInheritanceX(): number;
|
|
102
|
+
/** Vertical position inheritance factor. `0` disables vertical position inheritance. */
|
|
103
|
+
get positionInheritanceY(): number;
|
|
104
|
+
/**
|
|
105
|
+
* Sets how much host object translation is inherited by skeleton physics constraints.
|
|
106
|
+
* Use `(1, 1)` for normal inheritance, or `(0, 0)` to disable position inheritance.
|
|
107
|
+
* @param x The horizontal position inheritance factor.
|
|
108
|
+
* @param y The vertical position inheritance factor.
|
|
109
|
+
*/
|
|
110
|
+
setPositionInheritance(x: number, y: number): void;
|
|
111
|
+
/** Rotation inheritance factor. `0` disables rotation inheritance. */
|
|
112
|
+
get rotationInheritance(): number;
|
|
113
|
+
/**
|
|
114
|
+
* Sets how much host object rotation is inherited by skeleton physics constraints.
|
|
115
|
+
* @param value The rotation inheritance factor.
|
|
116
|
+
*/
|
|
117
|
+
set rotationInheritance(value: number);
|
|
118
|
+
/** Resets the previous position used to calculate inherited translation. */
|
|
119
|
+
resetPosition(): void;
|
|
120
|
+
/** Resets the previous rotation used to calculate inherited rotation. */
|
|
121
|
+
resetRotation(): void;
|
|
122
|
+
/** Resets both previous position and previous rotation. */
|
|
123
|
+
resetTransform(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Applies host object transform movement since the previous call to the skeleton's physics constraints.
|
|
126
|
+
*
|
|
127
|
+
* The first call records the current transform as the baseline and does not apply movement.
|
|
128
|
+
*/
|
|
129
|
+
applyTransformMovement(): void;
|
|
130
|
+
private applyPositionMovement;
|
|
131
|
+
private applyRotationMovement;
|
|
132
|
+
private setLastTransform;
|
|
133
|
+
private getRotationDelta;
|
|
134
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
/**
|
|
30
|
+
* Tracks movement of a host runtime object and applies that movement to skeleton physics constraints.
|
|
31
|
+
*
|
|
32
|
+
* This is useful for runtimes where a Spine skeleton is displayed by a movable object or container.
|
|
33
|
+
* When enabled, changes in the host object's position are converted to skeleton coordinates and passed to
|
|
34
|
+
* {@link Skeleton.physicsTranslate}. Changes in its rotation are passed to {@link Skeleton.physicsRotate}.
|
|
35
|
+
*
|
|
36
|
+
* Movement inheritance is opt-in. Position and rotation inheritance default to `0`, so
|
|
37
|
+
* {@link applyTransformMovement} returns immediately until one of the inheritance values is non-zero.
|
|
38
|
+
*/
|
|
39
|
+
export class SkeletonPhysicsMovement {
|
|
40
|
+
skeleton;
|
|
41
|
+
adapter;
|
|
42
|
+
positionInheritanceFactorX = 0;
|
|
43
|
+
positionInheritanceFactorY = 0;
|
|
44
|
+
rotationInheritanceFactor = 0;
|
|
45
|
+
hasLastTransform = false;
|
|
46
|
+
lastX = 0;
|
|
47
|
+
lastY = 0;
|
|
48
|
+
lastZ = 0;
|
|
49
|
+
lastRotation = 0;
|
|
50
|
+
currentTransform = { x: 0, y: 0, z: 0, rotation: 0 };
|
|
51
|
+
currentPosition = { x: 0, y: 0, z: 0 };
|
|
52
|
+
lastPosition = { x: 0, y: 0, z: 0 };
|
|
53
|
+
/**
|
|
54
|
+
* Creates a movement tracker for a skeleton displayed by a host runtime object.
|
|
55
|
+
* @param skeleton The skeleton whose physics constraints receive inherited movement.
|
|
56
|
+
* @param adapter Runtime-specific hooks used to read and convert the host object's transform.
|
|
57
|
+
* @param options Initial movement inheritance values.
|
|
58
|
+
*/
|
|
59
|
+
constructor(skeleton, adapter, options = {}) {
|
|
60
|
+
this.skeleton = skeleton;
|
|
61
|
+
this.adapter = adapter;
|
|
62
|
+
this.positionInheritanceFactorX = options.positionInheritanceX ?? 0;
|
|
63
|
+
this.positionInheritanceFactorY = options.positionInheritanceY ?? 0;
|
|
64
|
+
this.rotationInheritanceFactor = options.rotationInheritance ?? 0;
|
|
65
|
+
}
|
|
66
|
+
/** Horizontal position inheritance factor. `0` disables horizontal position inheritance. */
|
|
67
|
+
get positionInheritanceX() {
|
|
68
|
+
return this.positionInheritanceFactorX;
|
|
69
|
+
}
|
|
70
|
+
/** Vertical position inheritance factor. `0` disables vertical position inheritance. */
|
|
71
|
+
get positionInheritanceY() {
|
|
72
|
+
return this.positionInheritanceFactorY;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sets how much host object translation is inherited by skeleton physics constraints.
|
|
76
|
+
* Use `(1, 1)` for normal inheritance, or `(0, 0)` to disable position inheritance.
|
|
77
|
+
* @param x The horizontal position inheritance factor.
|
|
78
|
+
* @param y The vertical position inheritance factor.
|
|
79
|
+
*/
|
|
80
|
+
setPositionInheritance(x, y) {
|
|
81
|
+
const wasDisabled = this.positionInheritanceFactorX === 0 && this.positionInheritanceFactorY === 0;
|
|
82
|
+
const isEnabled = x !== 0 || y !== 0;
|
|
83
|
+
this.positionInheritanceFactorX = x;
|
|
84
|
+
this.positionInheritanceFactorY = y;
|
|
85
|
+
if (wasDisabled && isEnabled)
|
|
86
|
+
this.resetPosition();
|
|
87
|
+
}
|
|
88
|
+
/** Rotation inheritance factor. `0` disables rotation inheritance. */
|
|
89
|
+
get rotationInheritance() {
|
|
90
|
+
return this.rotationInheritanceFactor;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Sets how much host object rotation is inherited by skeleton physics constraints.
|
|
94
|
+
* @param value The rotation inheritance factor.
|
|
95
|
+
*/
|
|
96
|
+
set rotationInheritance(value) {
|
|
97
|
+
const wasDisabled = this.rotationInheritanceFactor === 0;
|
|
98
|
+
this.rotationInheritanceFactor = value;
|
|
99
|
+
if (wasDisabled && value !== 0)
|
|
100
|
+
this.resetRotation();
|
|
101
|
+
}
|
|
102
|
+
/** Resets the previous position used to calculate inherited translation. */
|
|
103
|
+
resetPosition() {
|
|
104
|
+
const transform = this.currentTransform;
|
|
105
|
+
const readRotation = !this.hasLastTransform && this.rotationInheritanceFactor !== 0;
|
|
106
|
+
this.adapter.readTransform(transform, readRotation);
|
|
107
|
+
this.lastX = transform.x;
|
|
108
|
+
this.lastY = transform.y;
|
|
109
|
+
this.lastZ = transform.z;
|
|
110
|
+
if (readRotation)
|
|
111
|
+
this.lastRotation = transform.rotation;
|
|
112
|
+
this.hasLastTransform = true;
|
|
113
|
+
}
|
|
114
|
+
/** Resets the previous rotation used to calculate inherited rotation. */
|
|
115
|
+
resetRotation() {
|
|
116
|
+
const transform = this.currentTransform;
|
|
117
|
+
this.adapter.readTransform(transform, true);
|
|
118
|
+
this.lastRotation = transform.rotation;
|
|
119
|
+
if (!this.hasLastTransform) {
|
|
120
|
+
this.lastX = transform.x;
|
|
121
|
+
this.lastY = transform.y;
|
|
122
|
+
this.lastZ = transform.z;
|
|
123
|
+
}
|
|
124
|
+
this.hasLastTransform = true;
|
|
125
|
+
}
|
|
126
|
+
/** Resets both previous position and previous rotation. */
|
|
127
|
+
resetTransform() {
|
|
128
|
+
const transform = this.currentTransform;
|
|
129
|
+
this.adapter.readTransform(transform, true);
|
|
130
|
+
this.setLastTransform(transform.x, transform.y, transform.z, transform.rotation);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Applies host object transform movement since the previous call to the skeleton's physics constraints.
|
|
134
|
+
*
|
|
135
|
+
* The first call records the current transform as the baseline and does not apply movement.
|
|
136
|
+
*/
|
|
137
|
+
applyTransformMovement() {
|
|
138
|
+
const inheritPosition = this.positionInheritanceFactorX !== 0 || this.positionInheritanceFactorY !== 0;
|
|
139
|
+
const inheritRotation = this.rotationInheritanceFactor !== 0;
|
|
140
|
+
if (!inheritPosition && !inheritRotation)
|
|
141
|
+
return;
|
|
142
|
+
const transform = this.currentTransform;
|
|
143
|
+
this.adapter.readTransform(transform, inheritRotation);
|
|
144
|
+
const { x, y, z } = transform;
|
|
145
|
+
const currentRotation = inheritRotation ? transform.rotation : this.lastRotation;
|
|
146
|
+
const positionChanged = x !== this.lastX || y !== this.lastY || z !== this.lastZ;
|
|
147
|
+
if (this.hasLastTransform) {
|
|
148
|
+
if (!positionChanged && currentRotation === this.lastRotation)
|
|
149
|
+
return;
|
|
150
|
+
if (inheritPosition && positionChanged)
|
|
151
|
+
this.applyPositionMovement(x, y, z);
|
|
152
|
+
if (inheritRotation && currentRotation !== this.lastRotation)
|
|
153
|
+
this.applyRotationMovement(currentRotation);
|
|
154
|
+
}
|
|
155
|
+
this.setLastTransform(x, y, z, currentRotation);
|
|
156
|
+
}
|
|
157
|
+
applyPositionMovement(currentX, currentY, currentZ) {
|
|
158
|
+
const currentPosition = this.currentPosition;
|
|
159
|
+
currentPosition.x = currentX;
|
|
160
|
+
currentPosition.y = currentY;
|
|
161
|
+
currentPosition.z = currentZ;
|
|
162
|
+
this.adapter.worldToSkeleton(currentPosition);
|
|
163
|
+
const lastPosition = this.lastPosition;
|
|
164
|
+
lastPosition.x = this.lastX;
|
|
165
|
+
lastPosition.y = this.lastY;
|
|
166
|
+
lastPosition.z = this.lastZ;
|
|
167
|
+
this.adapter.worldToSkeleton(lastPosition);
|
|
168
|
+
this.skeleton.physicsTranslate((currentPosition.x - lastPosition.x) * this.positionInheritanceFactorX, (currentPosition.y - lastPosition.y) * this.positionInheritanceFactorY);
|
|
169
|
+
}
|
|
170
|
+
applyRotationMovement(currentRotation) {
|
|
171
|
+
const rotationFactor = this.rotationInheritanceFactor;
|
|
172
|
+
if (rotationFactor === 0)
|
|
173
|
+
return;
|
|
174
|
+
this.skeleton.physicsRotate(0, 0, this.getRotationDelta(currentRotation, this.lastRotation) * rotationFactor);
|
|
175
|
+
}
|
|
176
|
+
setLastTransform(x, y, z, rotation) {
|
|
177
|
+
this.lastX = x;
|
|
178
|
+
this.lastY = y;
|
|
179
|
+
this.lastZ = z;
|
|
180
|
+
this.lastRotation = rotation;
|
|
181
|
+
this.hasLastTransform = true;
|
|
182
|
+
}
|
|
183
|
+
getRotationDelta(current, previous) {
|
|
184
|
+
let delta = current - previous;
|
|
185
|
+
delta = (delta + 180) % 360 - 180;
|
|
186
|
+
return delta < -180 ? delta + 360 : delta;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25QaHlzaWNzTW92ZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2tlbGV0b25QaHlzaWNzTW92ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBZ0QvRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBb0IxQjtJQUNBO0lBcEJELDBCQUEwQixHQUFHLENBQUMsQ0FBQztJQUMvQiwwQkFBMEIsR0FBRyxDQUFDLENBQUM7SUFDL0IseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDVixZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZGLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdkMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVyRDs7Ozs7T0FLRztJQUNILFlBQ1MsUUFBa0IsRUFDbEIsT0FBdUMsRUFDL0MsVUFBMEMsRUFBRTtRQUZwQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQWdDO1FBRy9DLElBQUksQ0FBQywwQkFBMEIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDO1FBQ3BF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LDBCQUEwQixDQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFFLGVBQXVCO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUN0RCxJQUFJLGNBQWMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFFTyxnQkFBZ0IsQ0FBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQjtRQUMxRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBRSxPQUFlLEVBQUUsUUFBZ0I7UUFDMUQsSUFBSSxLQUFLLEdBQUcsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMvQixLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNsQyxPQUFPLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yXG4gKiBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5cbi8qKiBBIGhvc3QgcnVudGltZSBvYmplY3QncyB3b3JsZCBwb3NpdGlvbiBhbmQgcm90YXRpb24gdXNlZCBmb3Igc2tlbGV0b24gcGh5c2ljcyBtb3ZlbWVudCBpbmhlcml0YW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRUcmFuc2Zvcm0ge1xuXHQvKiogVGhlIGhvc3Qgb2JqZWN0J3MgWCBwb3NpdGlvbiBpbiB3b3JsZCBjb29yZGluYXRlcy4gKi9cblx0eDogbnVtYmVyO1xuXG5cdC8qKiBUaGUgaG9zdCBvYmplY3QncyBZIHBvc2l0aW9uIGluIHdvcmxkIGNvb3JkaW5hdGVzLiAqL1xuXHR5OiBudW1iZXI7XG5cblx0LyoqIFRoZSBob3N0IG9iamVjdCdzIFogcG9zaXRpb24gaW4gd29ybGQgY29vcmRpbmF0ZXMuIFNldCB0byBgMGAgaW4gMkQgcnVudGltZXMuICovXG5cdHo6IG51bWJlcjtcblxuXHQvKiogVGhlIGhvc3Qgb2JqZWN0J3Mgcm90YXRpb24gYXJvdW5kIHRoZSBza2VsZXRvbiBwbGFuZSBub3JtYWwsIGluIGRlZ3JlZXMgYW5kIGluIHRoZSBkaXJlY3Rpb24gZXhwZWN0ZWQgYnkgU3BpbmUgcGh5c2ljcy4gKi9cblx0cm90YXRpb246IG51bWJlcjtcbn1cblxuLyoqIEluaXRpYWwgbW92ZW1lbnQgaW5oZXJpdGFuY2UgdmFsdWVzIGZvciB7QGxpbmsgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudE9wdGlvbnMge1xuXHQvKiogSW5pdGlhbCBob3Jpem9udGFsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHBvc2l0aW9uSW5oZXJpdGFuY2VYPzogbnVtYmVyO1xuXG5cdC8qKiBJbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHBvc2l0aW9uSW5oZXJpdGFuY2VZPzogbnVtYmVyO1xuXG5cdC8qKiBJbml0aWFsIHJvdGF0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHJvdGF0aW9uSW5oZXJpdGFuY2U/OiBudW1iZXI7XG59XG5cbi8qKiBSdW50aW1lLXNwZWNpZmljIGhvb2tzIG5lZWRlZCBieSB7QGxpbmsgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudEFkYXB0ZXIge1xuXHQvKipcblx0ICogV3JpdGVzIHRoZSBjdXJyZW50IGhvc3Qgb2JqZWN0IHdvcmxkIHBvc2l0aW9uIHRvIGBvdXRgIGFuZCwgd2hlbiBgcmVhZFJvdGF0aW9uYCBpcyB0cnVlLCBpdHMgcm90YXRpb24uXG5cdCAqIEltcGxlbWVudGF0aW9ucyBtYXkgc2tpcCBjYWxjdWxhdGluZyBhbmQgd3JpdGluZyBgb3V0LnJvdGF0aW9uYCB3aGVuIGByZWFkUm90YXRpb25gIGlzIGZhbHNlLlxuXHQgKiBAcGFyYW0gb3V0IFJlY2VpdmVzIHRoZSBjdXJyZW50IGhvc3Qgb2JqZWN0IHRyYW5zZm9ybS5cblx0ICogQHBhcmFtIHJlYWRSb3RhdGlvbiBXaGV0aGVyIHRoZSBjdXJyZW50IHJvdGF0aW9uIGlzIG5lZWRlZC5cblx0ICovXG5cdHJlYWRUcmFuc2Zvcm0gKG91dDogU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRUcmFuc2Zvcm0sIHJlYWRSb3RhdGlvbjogYm9vbGVhbik6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGBwb2ludGAgaW4tcGxhY2UgZnJvbSBob3N0IHdvcmxkIGNvb3JkaW5hdGVzIHRvIHNrZWxldG9uIGNvb3JkaW5hdGVzLlxuXHQgKiBUaGUgY29udmVydGVkIHNrZWxldG9uIGNvb3JkaW5hdGVzIGFyZSByZXR1cm5lZCBpbiBgcG9pbnQueGAgYW5kIGBwb2ludC55YC5cblx0ICovXG5cdHdvcmxkVG9Ta2VsZXRvbiAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUcmFja3MgbW92ZW1lbnQgb2YgYSBob3N0IHJ1bnRpbWUgb2JqZWN0IGFuZCBhcHBsaWVzIHRoYXQgbW92ZW1lbnQgdG8gc2tlbGV0b24gcGh5c2ljcyBjb25zdHJhaW50cy5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcnVudGltZXMgd2hlcmUgYSBTcGluZSBza2VsZXRvbiBpcyBkaXNwbGF5ZWQgYnkgYSBtb3ZhYmxlIG9iamVjdCBvciBjb250YWluZXIuXG4gKiBXaGVuIGVuYWJsZWQsIGNoYW5nZXMgaW4gdGhlIGhvc3Qgb2JqZWN0J3MgcG9zaXRpb24gYXJlIGNvbnZlcnRlZCB0byBza2VsZXRvbiBjb29yZGluYXRlcyBhbmQgcGFzc2VkIHRvXG4gKiB7QGxpbmsgU2tlbGV0b24ucGh5c2ljc1RyYW5zbGF0ZX0uIENoYW5nZXMgaW4gaXRzIHJvdGF0aW9uIGFyZSBwYXNzZWQgdG8ge0BsaW5rIFNrZWxldG9uLnBoeXNpY3NSb3RhdGV9LlxuICpcbiAqIE1vdmVtZW50IGluaGVyaXRhbmNlIGlzIG9wdC1pbi4gUG9zaXRpb24gYW5kIHJvdGF0aW9uIGluaGVyaXRhbmNlIGRlZmF1bHQgdG8gYDBgLCBzb1xuICoge0BsaW5rIGFwcGx5VHJhbnNmb3JtTW92ZW1lbnR9IHJldHVybnMgaW1tZWRpYXRlbHkgdW50aWwgb25lIG9mIHRoZSBpbmhlcml0YW5jZSB2YWx1ZXMgaXMgbm9uLXplcm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudCB7XG5cdHByaXZhdGUgcG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclggPSAwO1xuXHRwcml2YXRlIHBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JZID0gMDtcblx0cHJpdmF0ZSByb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID0gMDtcblx0cHJpdmF0ZSBoYXNMYXN0VHJhbnNmb3JtID0gZmFsc2U7XG5cdHByaXZhdGUgbGFzdFggPSAwO1xuXHRwcml2YXRlIGxhc3RZID0gMDtcblx0cHJpdmF0ZSBsYXN0WiA9IDA7XG5cdHByaXZhdGUgbGFzdFJvdGF0aW9uID0gMDtcblx0cHJpdmF0ZSByZWFkb25seSBjdXJyZW50VHJhbnNmb3JtOiBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudFRyYW5zZm9ybSA9IHsgeDogMCwgeTogMCwgejogMCwgcm90YXRpb246IDAgfTtcblx0cHJpdmF0ZSByZWFkb25seSBjdXJyZW50UG9zaXRpb24gPSB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcblx0cHJpdmF0ZSByZWFkb25seSBsYXN0UG9zaXRpb24gPSB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG1vdmVtZW50IHRyYWNrZXIgZm9yIGEgc2tlbGV0b24gZGlzcGxheWVkIGJ5IGEgaG9zdCBydW50aW1lIG9iamVjdC5cblx0ICogQHBhcmFtIHNrZWxldG9uIFRoZSBza2VsZXRvbiB3aG9zZSBwaHlzaWNzIGNvbnN0cmFpbnRzIHJlY2VpdmUgaW5oZXJpdGVkIG1vdmVtZW50LlxuXHQgKiBAcGFyYW0gYWRhcHRlciBSdW50aW1lLXNwZWNpZmljIGhvb2tzIHVzZWQgdG8gcmVhZCBhbmQgY29udmVydCB0aGUgaG9zdCBvYmplY3QncyB0cmFuc2Zvcm0uXG5cdCAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWwgbW92ZW1lbnQgaW5oZXJpdGFuY2UgdmFsdWVzLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgc2tlbGV0b246IFNrZWxldG9uLFxuXHRcdHByaXZhdGUgYWRhcHRlcjogU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRBZGFwdGVyLFxuXHRcdG9wdGlvbnM6IFNrZWxldG9uUGh5c2ljc01vdmVtZW50T3B0aW9ucyA9IHt9LFxuXHQpIHtcblx0XHR0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JYID0gb3B0aW9ucy5wb3NpdGlvbkluaGVyaXRhbmNlWCA/PyAwO1xuXHRcdHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclkgPSBvcHRpb25zLnBvc2l0aW9uSW5oZXJpdGFuY2VZID8/IDA7XG5cdFx0dGhpcy5yb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID0gb3B0aW9ucy5yb3RhdGlvbkluaGVyaXRhbmNlID8/IDA7XG5cdH1cblxuXHQvKiogSG9yaXpvbnRhbCBwb3NpdGlvbiBpbmhlcml0YW5jZSBmYWN0b3IuIGAwYCBkaXNhYmxlcyBob3Jpem9udGFsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiAqL1xuXHRnZXQgcG9zaXRpb25Jbmhlcml0YW5jZVggKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3Rvclg7XG5cdH1cblxuXHQvKiogVmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLiBgMGAgZGlzYWJsZXMgdmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UuICovXG5cdGdldCBwb3NpdGlvbkluaGVyaXRhbmNlWSAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhvdyBtdWNoIGhvc3Qgb2JqZWN0IHRyYW5zbGF0aW9uIGlzIGluaGVyaXRlZCBieSBza2VsZXRvbiBwaHlzaWNzIGNvbnN0cmFpbnRzLlxuXHQgKiBVc2UgYCgxLCAxKWAgZm9yIG5vcm1hbCBpbmhlcml0YW5jZSwgb3IgYCgwLCAwKWAgdG8gZGlzYWJsZSBwb3NpdGlvbiBpbmhlcml0YW5jZS5cblx0ICogQHBhcmFtIHggVGhlIGhvcml6b250YWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLlxuXHQgKiBAcGFyYW0geSBUaGUgdmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLlxuXHQgKi9cblx0c2V0UG9zaXRpb25Jbmhlcml0YW5jZSAoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCB3YXNEaXNhYmxlZCA9IHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclggPT09IDAgJiYgdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWSA9PT0gMDtcblx0XHRjb25zdCBpc0VuYWJsZWQgPSB4ICE9PSAwIHx8IHkgIT09IDA7XG5cdFx0dGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWCA9IHg7XG5cdFx0dGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWSA9IHk7XG5cdFx0aWYgKHdhc0Rpc2FibGVkICYmIGlzRW5hYmxlZCkgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG5cdH1cblxuXHQvKiogUm90YXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLiBgMGAgZGlzYWJsZXMgcm90YXRpb24gaW5oZXJpdGFuY2UuICovXG5cdGdldCByb3RhdGlvbkluaGVyaXRhbmNlICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLnJvdGF0aW9uSW5oZXJpdGFuY2VGYWN0b3I7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBob3cgbXVjaCBob3N0IG9iamVjdCByb3RhdGlvbiBpcyBpbmhlcml0ZWQgYnkgc2tlbGV0b24gcGh5c2ljcyBjb25zdHJhaW50cy5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSByb3RhdGlvbiBpbmhlcml0YW5jZSBmYWN0b3IuXG5cdCAqL1xuXHRzZXQgcm90YXRpb25Jbmhlcml0YW5jZSAodmFsdWU6IG51bWJlcikge1xuXHRcdGNvbnN0IHdhc0Rpc2FibGVkID0gdGhpcy5yb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID09PSAwO1xuXHRcdHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciA9IHZhbHVlO1xuXHRcdGlmICh3YXNEaXNhYmxlZCAmJiB2YWx1ZSAhPT0gMCkgdGhpcy5yZXNldFJvdGF0aW9uKCk7XG5cdH1cblxuXHQvKiogUmVzZXRzIHRoZSBwcmV2aW91cyBwb3NpdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBpbmhlcml0ZWQgdHJhbnNsYXRpb24uICovXG5cdHJlc2V0UG9zaXRpb24gKCk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuY3VycmVudFRyYW5zZm9ybTtcblx0XHRjb25zdCByZWFkUm90YXRpb24gPSAhdGhpcy5oYXNMYXN0VHJhbnNmb3JtICYmIHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciAhPT0gMDtcblx0XHR0aGlzLmFkYXB0ZXIucmVhZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJlYWRSb3RhdGlvbik7XG5cdFx0dGhpcy5sYXN0WCA9IHRyYW5zZm9ybS54O1xuXHRcdHRoaXMubGFzdFkgPSB0cmFuc2Zvcm0ueTtcblx0XHR0aGlzLmxhc3RaID0gdHJhbnNmb3JtLno7XG5cdFx0aWYgKHJlYWRSb3RhdGlvbikgdGhpcy5sYXN0Um90YXRpb24gPSB0cmFuc2Zvcm0ucm90YXRpb247XG5cdFx0dGhpcy5oYXNMYXN0VHJhbnNmb3JtID0gdHJ1ZTtcblx0fVxuXG5cdC8qKiBSZXNldHMgdGhlIHByZXZpb3VzIHJvdGF0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIGluaGVyaXRlZCByb3RhdGlvbi4gKi9cblx0cmVzZXRSb3RhdGlvbiAoKTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNmb3JtID0gdGhpcy5jdXJyZW50VHJhbnNmb3JtO1xuXHRcdHRoaXMuYWRhcHRlci5yZWFkVHJhbnNmb3JtKHRyYW5zZm9ybSwgdHJ1ZSk7XG5cdFx0dGhpcy5sYXN0Um90YXRpb24gPSB0cmFuc2Zvcm0ucm90YXRpb247XG5cdFx0aWYgKCF0aGlzLmhhc0xhc3RUcmFuc2Zvcm0pIHtcblx0XHRcdHRoaXMubGFzdFggPSB0cmFuc2Zvcm0ueDtcblx0XHRcdHRoaXMubGFzdFkgPSB0cmFuc2Zvcm0ueTtcblx0XHRcdHRoaXMubGFzdFogPSB0cmFuc2Zvcm0uejtcblx0XHR9XG5cdFx0dGhpcy5oYXNMYXN0VHJhbnNmb3JtID0gdHJ1ZTtcblx0fVxuXG5cdC8qKiBSZXNldHMgYm90aCBwcmV2aW91cyBwb3NpdGlvbiBhbmQgcHJldmlvdXMgcm90YXRpb24uICovXG5cdHJlc2V0VHJhbnNmb3JtICgpOiB2b2lkIHtcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07XG5cdFx0dGhpcy5hZGFwdGVyLnJlYWRUcmFuc2Zvcm0odHJhbnNmb3JtLCB0cnVlKTtcblx0XHR0aGlzLnNldExhc3RUcmFuc2Zvcm0odHJhbnNmb3JtLngsIHRyYW5zZm9ybS55LCB0cmFuc2Zvcm0ueiwgdHJhbnNmb3JtLnJvdGF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBsaWVzIGhvc3Qgb2JqZWN0IHRyYW5zZm9ybSBtb3ZlbWVudCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGUgc2tlbGV0b24ncyBwaHlzaWNzIGNvbnN0cmFpbnRzLlxuXHQgKlxuXHQgKiBUaGUgZmlyc3QgY2FsbCByZWNvcmRzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBhcyB0aGUgYmFzZWxpbmUgYW5kIGRvZXMgbm90IGFwcGx5IG1vdmVtZW50LlxuXHQgKi9cblx0YXBwbHlUcmFuc2Zvcm1Nb3ZlbWVudCAoKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5oZXJpdFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWCAhPT0gMCB8fCB0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JZICE9PSAwO1xuXHRcdGNvbnN0IGluaGVyaXRSb3RhdGlvbiA9IHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciAhPT0gMDtcblx0XHRpZiAoIWluaGVyaXRQb3NpdGlvbiAmJiAhaW5oZXJpdFJvdGF0aW9uKSByZXR1cm47XG5cblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07XG5cdFx0dGhpcy5hZGFwdGVyLnJlYWRUcmFuc2Zvcm0odHJhbnNmb3JtLCBpbmhlcml0Um90YXRpb24pO1xuXHRcdGNvbnN0IHsgeCwgeSwgeiB9ID0gdHJhbnNmb3JtO1xuXHRcdGNvbnN0IGN1cnJlbnRSb3RhdGlvbiA9IGluaGVyaXRSb3RhdGlvbiA/IHRyYW5zZm9ybS5yb3RhdGlvbiA6IHRoaXMubGFzdFJvdGF0aW9uO1xuXHRcdGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IHggIT09IHRoaXMubGFzdFggfHwgeSAhPT0gdGhpcy5sYXN0WSB8fCB6ICE9PSB0aGlzLmxhc3RaO1xuXG5cdFx0aWYgKHRoaXMuaGFzTGFzdFRyYW5zZm9ybSkge1xuXHRcdFx0aWYgKCFwb3NpdGlvbkNoYW5nZWQgJiYgY3VycmVudFJvdGF0aW9uID09PSB0aGlzLmxhc3RSb3RhdGlvbikgcmV0dXJuO1xuXHRcdFx0aWYgKGluaGVyaXRQb3NpdGlvbiAmJiBwb3NpdGlvbkNoYW5nZWQpIHRoaXMuYXBwbHlQb3NpdGlvbk1vdmVtZW50KHgsIHksIHopO1xuXHRcdFx0aWYgKGluaGVyaXRSb3RhdGlvbiAmJiBjdXJyZW50Um90YXRpb24gIT09IHRoaXMubGFzdFJvdGF0aW9uKSB0aGlzLmFwcGx5Um90YXRpb25Nb3ZlbWVudChjdXJyZW50Um90YXRpb24pO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0TGFzdFRyYW5zZm9ybSh4LCB5LCB6LCBjdXJyZW50Um90YXRpb24pO1xuXHR9XG5cblx0cHJpdmF0ZSBhcHBseVBvc2l0aW9uTW92ZW1lbnQgKGN1cnJlbnRYOiBudW1iZXIsIGN1cnJlbnRZOiBudW1iZXIsIGN1cnJlbnRaOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50UG9zaXRpb24gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjtcblx0XHRjdXJyZW50UG9zaXRpb24ueCA9IGN1cnJlbnRYO1xuXHRcdGN1cnJlbnRQb3NpdGlvbi55ID0gY3VycmVudFk7XG5cdFx0Y3VycmVudFBvc2l0aW9uLnogPSBjdXJyZW50Wjtcblx0XHR0aGlzLmFkYXB0ZXIud29ybGRUb1NrZWxldG9uKGN1cnJlbnRQb3NpdGlvbik7XG5cblx0XHRjb25zdCBsYXN0UG9zaXRpb24gPSB0aGlzLmxhc3RQb3NpdGlvbjtcblx0XHRsYXN0UG9zaXRpb24ueCA9IHRoaXMubGFzdFg7XG5cdFx0bGFzdFBvc2l0aW9uLnkgPSB0aGlzLmxhc3RZO1xuXHRcdGxhc3RQb3NpdGlvbi56ID0gdGhpcy5sYXN0Wjtcblx0XHR0aGlzLmFkYXB0ZXIud29ybGRUb1NrZWxldG9uKGxhc3RQb3NpdGlvbik7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBoeXNpY3NUcmFuc2xhdGUoXG5cdFx0XHQoY3VycmVudFBvc2l0aW9uLnggLSBsYXN0UG9zaXRpb24ueCkgKiB0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JYLFxuXHRcdFx0KGN1cnJlbnRQb3NpdGlvbi55IC0gbGFzdFBvc2l0aW9uLnkpICogdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5Um90YXRpb25Nb3ZlbWVudCAoY3VycmVudFJvdGF0aW9uOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCByb3RhdGlvbkZhY3RvciA9IHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3Rvcjtcblx0XHRpZiAocm90YXRpb25GYWN0b3IgPT09IDApIHJldHVybjtcblx0XHR0aGlzLnNrZWxldG9uLnBoeXNpY3NSb3RhdGUoMCwgMCwgdGhpcy5nZXRSb3RhdGlvbkRlbHRhKGN1cnJlbnRSb3RhdGlvbiwgdGhpcy5sYXN0Um90YXRpb24pICogcm90YXRpb25GYWN0b3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRMYXN0VHJhbnNmb3JtICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCByb3RhdGlvbjogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5sYXN0WCA9IHg7XG5cdFx0dGhpcy5sYXN0WSA9IHk7XG5cdFx0dGhpcy5sYXN0WiA9IHo7XG5cdFx0dGhpcy5sYXN0Um90YXRpb24gPSByb3RhdGlvbjtcblx0XHR0aGlzLmhhc0xhc3RUcmFuc2Zvcm0gPSB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSb3RhdGlvbkRlbHRhIChjdXJyZW50OiBudW1iZXIsIHByZXZpb3VzOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGxldCBkZWx0YSA9IGN1cnJlbnQgLSBwcmV2aW91cztcblx0XHRkZWx0YSA9IChkZWx0YSArIDE4MCkgJSAzNjAgLSAxODA7XG5cdFx0cmV0dXJuIGRlbHRhIDwgLTE4MCA/IGRlbHRhICsgMzYwIDogZGVsdGE7XG5cdH1cbn1cbiJdfQ==
|