qms-angular 1.0.36 → 1.0.40
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/bundles/qms-angular.umd.js +7101 -221
- package/bundles/qms-angular.umd.js.map +1 -1
- package/esm2015/lib/components/breadcrumb/breadcrumb.js +29 -6
- package/esm2015/lib/components/qms-app-bar/qms-app-bar.component.js +2 -2
- package/esm2015/lib/components/related/popup/related-popup.component.js +2 -2
- package/esm2015/lib/model/en.js +144 -1
- package/esm2015/lib/model/no.js +148 -5
- package/esm2015/lib/qms-ckeditor-components/common/bpmn/inspector.function.js +2147 -0
- package/esm2015/lib/qms-ckeditor-components/common/bpmn/toolbar.function.js +200 -0
- package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.js +6 -1
- package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.js +36 -0
- package/esm2015/lib/qms-ckeditor-components/common/constants/iconSvg.constants.js +8 -0
- package/esm2015/lib/qms-ckeditor-components/common/enums/flowchart-view-mode.enum.js +6 -0
- package/esm2015/lib/qms-ckeditor-components/common/enums/image-mode.enum.js +9 -0
- package/esm2015/lib/qms-ckeditor-components/common/enums/protocol-type.enum.js +11 -3
- package/esm2015/lib/qms-ckeditor-components/common/enums/related-to-item-type.js +11 -0
- package/esm2015/lib/qms-ckeditor-components/common/enums/target-type.enum.js +8 -1
- package/esm2015/lib/qms-ckeditor-components/common/functions/common.function.js +6 -2
- package/esm2015/lib/qms-ckeditor-components/common/helper/guidHelper.js +14 -0
- package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn-template.model.js +9 -0
- package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn.model.js +9 -0
- package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.js +1 -9
- package/esm2015/lib/qms-ckeditor-components/common/module/confirm/qms-ckeditor-confirm.component.js +3 -3
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.js +266 -0
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.js +67 -0
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.js +524 -0
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.js +1948 -0
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.js +7 -0
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/attachments/link-attachment.component.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/qms-ckeditor-link.component.js +5 -5
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-load-template/qms-ckeditor-load-template.component.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-relation/qmsckeditor-related.component.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-template/qms-ckeditor-template.component.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-tooltip/qms-ckeditor-tooltip.component.js +1 -1
- package/esm2015/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.js +22 -0
- package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +68 -5
- package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.module.js +16 -2
- package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.js +26 -0
- package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.js +1156 -0
- package/esm2015/public-api.js +14 -1
- package/esm2015/qms-angular.js +3 -1
- package/fesm2015/qms-angular.js +7017 -226
- package/fesm2015/qms-angular.js.map +1 -1
- package/lib/components/breadcrumb/breadcrumb.d.ts +6 -3
- package/lib/model/en.d.ts +143 -0
- package/lib/model/no.d.ts +143 -0
- package/lib/qms-ckeditor-components/common/bpmn/inspector.function.d.ts +1825 -0
- package/lib/qms-ckeditor-components/common/bpmn/toolbar.function.d.ts +163 -0
- package/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.d.ts +5 -0
- package/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.d.ts +34 -0
- package/lib/qms-ckeditor-components/common/constants/iconSvg.constants.d.ts +7 -0
- package/lib/qms-ckeditor-components/common/enums/flowchart-view-mode.enum.d.ts +4 -0
- package/lib/qms-ckeditor-components/common/enums/image-mode.enum.d.ts +7 -0
- package/lib/qms-ckeditor-components/common/enums/protocol-type.enum.d.ts +9 -2
- package/lib/qms-ckeditor-components/common/enums/related-to-item-type.d.ts +9 -0
- package/lib/qms-ckeditor-components/common/enums/target-type.enum.d.ts +6 -0
- package/lib/qms-ckeditor-components/common/helper/guidHelper.d.ts +6 -0
- package/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn-template.model.d.ts +7 -0
- package/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn.model.d.ts +7 -0
- package/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.d.ts +1 -0
- package/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.d.ts +7 -7
- package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.d.ts +37 -0
- package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.d.ts +23 -0
- package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.d.ts +123 -0
- package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.d.ts +542 -0
- package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.d.ts +2 -0
- package/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.d.ts +20 -0
- package/lib/qms-ckeditor-components/qms-ckeditor.component.d.ts +7 -2
- package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.d.ts +10 -0
- package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.d.ts +33 -0
- package/lib.theme.scss +4 -1
- package/package.json +1 -1
- package/public-api.d.ts +12 -0
- package/qms-angular.d.ts +2 -0
- package/qms-angular.metadata.json +1 -1
- package/src/assets/images/panel-stencil-container-background-image.png +0 -0
- package/src/assets/jointjs/js/backbone/backbone.js +2096 -0
- package/src/assets/jointjs/js/client.js +17 -0
- package/src/assets/jointjs/js/example.js +42 -0
- package/src/assets/jointjs/js/gd.js +135 -0
- package/src/assets/jointjs/js/joint.format.raster.js +386 -0
- package/src/assets/jointjs/js/joint.format.svg.js +252 -0
- package/src/assets/jointjs/js/jquery/jquery.js +10872 -0
- package/src/assets/jointjs/js/lodash/LICENSE +47 -0
- package/src/assets/jointjs/js/lodash/README.md +39 -0
- package/src/assets/jointjs/js/lodash/_DataView.js +7 -0
- package/src/assets/jointjs/js/lodash/_Hash.js +32 -0
- package/src/assets/jointjs/js/lodash/_LazyWrapper.js +28 -0
- package/src/assets/jointjs/js/lodash/_ListCache.js +32 -0
- package/src/assets/jointjs/js/lodash/_LodashWrapper.js +22 -0
- package/src/assets/jointjs/js/lodash/_Map.js +7 -0
- package/src/assets/jointjs/js/lodash/_MapCache.js +32 -0
- package/src/assets/jointjs/js/lodash/_Promise.js +7 -0
- package/src/assets/jointjs/js/lodash/_Set.js +7 -0
- package/src/assets/jointjs/js/lodash/_SetCache.js +27 -0
- package/src/assets/jointjs/js/lodash/_Stack.js +27 -0
- package/src/assets/jointjs/js/lodash/_Symbol.js +6 -0
- package/src/assets/jointjs/js/lodash/_Uint8Array.js +6 -0
- package/src/assets/jointjs/js/lodash/_WeakMap.js +7 -0
- package/src/assets/jointjs/js/lodash/_apply.js +21 -0
- package/src/assets/jointjs/js/lodash/_arrayAggregator.js +22 -0
- package/src/assets/jointjs/js/lodash/_arrayEach.js +22 -0
- package/src/assets/jointjs/js/lodash/_arrayEachRight.js +21 -0
- package/src/assets/jointjs/js/lodash/_arrayEvery.js +23 -0
- package/src/assets/jointjs/js/lodash/_arrayFilter.js +25 -0
- package/src/assets/jointjs/js/lodash/_arrayIncludes.js +17 -0
- package/src/assets/jointjs/js/lodash/_arrayIncludesWith.js +22 -0
- package/src/assets/jointjs/js/lodash/_arrayLikeKeys.js +49 -0
- package/src/assets/jointjs/js/lodash/_arrayMap.js +21 -0
- package/src/assets/jointjs/js/lodash/_arrayPush.js +20 -0
- package/src/assets/jointjs/js/lodash/_arrayReduce.js +26 -0
- package/src/assets/jointjs/js/lodash/_arrayReduceRight.js +24 -0
- package/src/assets/jointjs/js/lodash/_arraySample.js +15 -0
- package/src/assets/jointjs/js/lodash/_arraySampleSize.js +17 -0
- package/src/assets/jointjs/js/lodash/_arrayShuffle.js +15 -0
- package/src/assets/jointjs/js/lodash/_arraySome.js +23 -0
- package/src/assets/jointjs/js/lodash/_asciiSize.js +12 -0
- package/src/assets/jointjs/js/lodash/_asciiToArray.js +12 -0
- package/src/assets/jointjs/js/lodash/_asciiWords.js +15 -0
- package/src/assets/jointjs/js/lodash/_assignMergeValue.js +20 -0
- package/src/assets/jointjs/js/lodash/_assignValue.js +28 -0
- package/src/assets/jointjs/js/lodash/_assocIndexOf.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseAggregator.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseAssign.js +17 -0
- package/src/assets/jointjs/js/lodash/_baseAssignIn.js +17 -0
- package/src/assets/jointjs/js/lodash/_baseAssignValue.js +25 -0
- package/src/assets/jointjs/js/lodash/_baseAt.js +23 -0
- package/src/assets/jointjs/js/lodash/_baseClamp.js +22 -0
- package/src/assets/jointjs/js/lodash/_baseClone.js +165 -0
- package/src/assets/jointjs/js/lodash/_baseConforms.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseConformsTo.js +27 -0
- package/src/assets/jointjs/js/lodash/_baseCreate.js +30 -0
- package/src/assets/jointjs/js/lodash/_baseDelay.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseDifference.js +67 -0
- package/src/assets/jointjs/js/lodash/_baseEach.js +14 -0
- package/src/assets/jointjs/js/lodash/_baseEachRight.js +14 -0
- package/src/assets/jointjs/js/lodash/_baseEvery.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseExtremum.js +32 -0
- package/src/assets/jointjs/js/lodash/_baseFill.js +32 -0
- package/src/assets/jointjs/js/lodash/_baseFilter.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseFindIndex.js +24 -0
- package/src/assets/jointjs/js/lodash/_baseFindKey.js +23 -0
- package/src/assets/jointjs/js/lodash/_baseFlatten.js +38 -0
- package/src/assets/jointjs/js/lodash/_baseFor.js +16 -0
- package/src/assets/jointjs/js/lodash/_baseForOwn.js +16 -0
- package/src/assets/jointjs/js/lodash/_baseForOwnRight.js +16 -0
- package/src/assets/jointjs/js/lodash/_baseForRight.js +15 -0
- package/src/assets/jointjs/js/lodash/_baseFunctions.js +19 -0
- package/src/assets/jointjs/js/lodash/_baseGet.js +24 -0
- package/src/assets/jointjs/js/lodash/_baseGetAllKeys.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseGetTag.js +28 -0
- package/src/assets/jointjs/js/lodash/_baseGt.js +14 -0
- package/src/assets/jointjs/js/lodash/_baseHas.js +19 -0
- package/src/assets/jointjs/js/lodash/_baseHasIn.js +13 -0
- package/src/assets/jointjs/js/lodash/_baseInRange.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIndexOf.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseIndexOfWith.js +23 -0
- package/src/assets/jointjs/js/lodash/_baseIntersection.js +74 -0
- package/src/assets/jointjs/js/lodash/_baseInverter.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseInvoke.js +24 -0
- package/src/assets/jointjs/js/lodash/_baseIsArguments.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIsArrayBuffer.js +17 -0
- package/src/assets/jointjs/js/lodash/_baseIsDate.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIsEqual.js +28 -0
- package/src/assets/jointjs/js/lodash/_baseIsEqualDeep.js +83 -0
- package/src/assets/jointjs/js/lodash/_baseIsMap.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIsMatch.js +62 -0
- package/src/assets/jointjs/js/lodash/_baseIsNaN.js +12 -0
- package/src/assets/jointjs/js/lodash/_baseIsNative.js +47 -0
- package/src/assets/jointjs/js/lodash/_baseIsRegExp.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIsSet.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseIsTypedArray.js +60 -0
- package/src/assets/jointjs/js/lodash/_baseIteratee.js +31 -0
- package/src/assets/jointjs/js/lodash/_baseKeys.js +30 -0
- package/src/assets/jointjs/js/lodash/_baseKeysIn.js +33 -0
- package/src/assets/jointjs/js/lodash/_baseLodash.js +10 -0
- package/src/assets/jointjs/js/lodash/_baseLt.js +14 -0
- package/src/assets/jointjs/js/lodash/_baseMap.js +22 -0
- package/src/assets/jointjs/js/lodash/_baseMatches.js +22 -0
- package/src/assets/jointjs/js/lodash/_baseMatchesProperty.js +33 -0
- package/src/assets/jointjs/js/lodash/_baseMean.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseMerge.js +42 -0
- package/src/assets/jointjs/js/lodash/_baseMergeDeep.js +94 -0
- package/src/assets/jointjs/js/lodash/_baseNth.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseOrderBy.js +34 -0
- package/src/assets/jointjs/js/lodash/_basePick.js +19 -0
- package/src/assets/jointjs/js/lodash/_basePickBy.js +30 -0
- package/src/assets/jointjs/js/lodash/_baseProperty.js +14 -0
- package/src/assets/jointjs/js/lodash/_basePropertyDeep.js +16 -0
- package/src/assets/jointjs/js/lodash/_basePropertyOf.js +14 -0
- package/src/assets/jointjs/js/lodash/_basePullAll.js +51 -0
- package/src/assets/jointjs/js/lodash/_basePullAt.js +37 -0
- package/src/assets/jointjs/js/lodash/_baseRandom.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseRange.js +28 -0
- package/src/assets/jointjs/js/lodash/_baseReduce.js +23 -0
- package/src/assets/jointjs/js/lodash/_baseRepeat.js +35 -0
- package/src/assets/jointjs/js/lodash/_baseRest.js +17 -0
- package/src/assets/jointjs/js/lodash/_baseSample.js +15 -0
- package/src/assets/jointjs/js/lodash/_baseSampleSize.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseSet.js +47 -0
- package/src/assets/jointjs/js/lodash/_baseSetData.js +17 -0
- package/src/assets/jointjs/js/lodash/_baseSetToString.js +22 -0
- package/src/assets/jointjs/js/lodash/_baseShuffle.js +15 -0
- package/src/assets/jointjs/js/lodash/_baseSlice.js +31 -0
- package/src/assets/jointjs/js/lodash/_baseSome.js +22 -0
- package/src/assets/jointjs/js/lodash/_baseSortBy.js +21 -0
- package/src/assets/jointjs/js/lodash/_baseSortedIndex.js +42 -0
- package/src/assets/jointjs/js/lodash/_baseSortedIndexBy.js +64 -0
- package/src/assets/jointjs/js/lodash/_baseSortedUniq.js +30 -0
- package/src/assets/jointjs/js/lodash/_baseSum.js +24 -0
- package/src/assets/jointjs/js/lodash/_baseTimes.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseToNumber.js +24 -0
- package/src/assets/jointjs/js/lodash/_baseToPairs.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseToString.js +37 -0
- package/src/assets/jointjs/js/lodash/_baseUnary.js +14 -0
- package/src/assets/jointjs/js/lodash/_baseUniq.js +72 -0
- package/src/assets/jointjs/js/lodash/_baseUnset.js +20 -0
- package/src/assets/jointjs/js/lodash/_baseUpdate.js +18 -0
- package/src/assets/jointjs/js/lodash/_baseValues.js +19 -0
- package/src/assets/jointjs/js/lodash/_baseWhile.js +26 -0
- package/src/assets/jointjs/js/lodash/_baseWrapperValue.js +25 -0
- package/src/assets/jointjs/js/lodash/_baseXor.js +36 -0
- package/src/assets/jointjs/js/lodash/_baseZipObject.js +23 -0
- package/src/assets/jointjs/js/lodash/_cacheHas.js +13 -0
- package/src/assets/jointjs/js/lodash/_castArrayLikeObject.js +14 -0
- package/src/assets/jointjs/js/lodash/_castFunction.js +14 -0
- package/src/assets/jointjs/js/lodash/_castPath.js +21 -0
- package/src/assets/jointjs/js/lodash/_castRest.js +14 -0
- package/src/assets/jointjs/js/lodash/_castSlice.js +18 -0
- package/src/assets/jointjs/js/lodash/_charsEndIndex.js +19 -0
- package/src/assets/jointjs/js/lodash/_charsStartIndex.js +20 -0
- package/src/assets/jointjs/js/lodash/_cloneArrayBuffer.js +16 -0
- package/src/assets/jointjs/js/lodash/_cloneBuffer.js +35 -0
- package/src/assets/jointjs/js/lodash/_cloneDataView.js +16 -0
- package/src/assets/jointjs/js/lodash/_cloneRegExp.js +17 -0
- package/src/assets/jointjs/js/lodash/_cloneSymbol.js +18 -0
- package/src/assets/jointjs/js/lodash/_cloneTypedArray.js +16 -0
- package/src/assets/jointjs/js/lodash/_compareAscending.js +41 -0
- package/src/assets/jointjs/js/lodash/_compareMultiple.js +44 -0
- package/src/assets/jointjs/js/lodash/_composeArgs.js +39 -0
- package/src/assets/jointjs/js/lodash/_composeArgsRight.js +41 -0
- package/src/assets/jointjs/js/lodash/_copyArray.js +20 -0
- package/src/assets/jointjs/js/lodash/_copyObject.js +40 -0
- package/src/assets/jointjs/js/lodash/_copySymbols.js +16 -0
- package/src/assets/jointjs/js/lodash/_copySymbolsIn.js +16 -0
- package/src/assets/jointjs/js/lodash/_coreJsData.js +6 -0
- package/src/assets/jointjs/js/lodash/_countHolders.js +21 -0
- package/src/assets/jointjs/js/lodash/_createAggregator.js +23 -0
- package/src/assets/jointjs/js/lodash/_createAssigner.js +37 -0
- package/src/assets/jointjs/js/lodash/_createBaseEach.js +32 -0
- package/src/assets/jointjs/js/lodash/_createBaseFor.js +25 -0
- package/src/assets/jointjs/js/lodash/_createBind.js +28 -0
- package/src/assets/jointjs/js/lodash/_createCaseFirst.js +33 -0
- package/src/assets/jointjs/js/lodash/_createCompounder.js +24 -0
- package/src/assets/jointjs/js/lodash/_createCtor.js +37 -0
- package/src/assets/jointjs/js/lodash/_createCurry.js +46 -0
- package/src/assets/jointjs/js/lodash/_createFind.js +25 -0
- package/src/assets/jointjs/js/lodash/_createFlow.js +78 -0
- package/src/assets/jointjs/js/lodash/_createHybrid.js +92 -0
- package/src/assets/jointjs/js/lodash/_createInverter.js +17 -0
- package/src/assets/jointjs/js/lodash/_createMathOperation.js +38 -0
- package/src/assets/jointjs/js/lodash/_createOver.js +27 -0
- package/src/assets/jointjs/js/lodash/_createPadding.js +33 -0
- package/src/assets/jointjs/js/lodash/_createPartial.js +43 -0
- package/src/assets/jointjs/js/lodash/_createRange.js +30 -0
- package/src/assets/jointjs/js/lodash/_createRecurry.js +56 -0
- package/src/assets/jointjs/js/lodash/_createRelationalOperation.js +20 -0
- package/src/assets/jointjs/js/lodash/_createRound.js +35 -0
- package/src/assets/jointjs/js/lodash/_createSet.js +19 -0
- package/src/assets/jointjs/js/lodash/_createToPairs.js +30 -0
- package/src/assets/jointjs/js/lodash/_createWrap.js +106 -0
- package/src/assets/jointjs/js/lodash/_customDefaultsAssignIn.js +29 -0
- package/src/assets/jointjs/js/lodash/_customDefaultsMerge.js +28 -0
- package/src/assets/jointjs/js/lodash/_customOmitClone.js +16 -0
- package/src/assets/jointjs/js/lodash/_deburrLetter.js +71 -0
- package/src/assets/jointjs/js/lodash/_defineProperty.js +11 -0
- package/src/assets/jointjs/js/lodash/_equalArrays.js +83 -0
- package/src/assets/jointjs/js/lodash/_equalByTag.js +112 -0
- package/src/assets/jointjs/js/lodash/_equalObjects.js +89 -0
- package/src/assets/jointjs/js/lodash/_escapeHtmlChar.js +21 -0
- package/src/assets/jointjs/js/lodash/_escapeStringChar.js +22 -0
- package/src/assets/jointjs/js/lodash/_flatRest.js +16 -0
- package/src/assets/jointjs/js/lodash/_freeGlobal.js +4 -0
- package/src/assets/jointjs/js/lodash/_getAllKeys.js +16 -0
- package/src/assets/jointjs/js/lodash/_getAllKeysIn.js +17 -0
- package/src/assets/jointjs/js/lodash/_getData.js +15 -0
- package/src/assets/jointjs/js/lodash/_getFuncName.js +31 -0
- package/src/assets/jointjs/js/lodash/_getHolder.js +13 -0
- package/src/assets/jointjs/js/lodash/_getMapData.js +18 -0
- package/src/assets/jointjs/js/lodash/_getMatchData.js +24 -0
- package/src/assets/jointjs/js/lodash/_getNative.js +17 -0
- package/src/assets/jointjs/js/lodash/_getPrototype.js +6 -0
- package/src/assets/jointjs/js/lodash/_getRawTag.js +46 -0
- package/src/assets/jointjs/js/lodash/_getSymbols.js +30 -0
- package/src/assets/jointjs/js/lodash/_getSymbolsIn.js +25 -0
- package/src/assets/jointjs/js/lodash/_getTag.js +58 -0
- package/src/assets/jointjs/js/lodash/_getValue.js +13 -0
- package/src/assets/jointjs/js/lodash/_getView.js +33 -0
- package/src/assets/jointjs/js/lodash/_getWrapDetails.js +17 -0
- package/src/assets/jointjs/js/lodash/_hasPath.js +39 -0
- package/src/assets/jointjs/js/lodash/_hasUnicode.js +26 -0
- package/src/assets/jointjs/js/lodash/_hasUnicodeWord.js +15 -0
- package/src/assets/jointjs/js/lodash/_hashClear.js +15 -0
- package/src/assets/jointjs/js/lodash/_hashDelete.js +17 -0
- package/src/assets/jointjs/js/lodash/_hashGet.js +30 -0
- package/src/assets/jointjs/js/lodash/_hashHas.js +23 -0
- package/src/assets/jointjs/js/lodash/_hashSet.js +23 -0
- package/src/assets/jointjs/js/lodash/_initCloneArray.js +26 -0
- package/src/assets/jointjs/js/lodash/_initCloneByTag.js +77 -0
- package/src/assets/jointjs/js/lodash/_initCloneObject.js +18 -0
- package/src/assets/jointjs/js/lodash/_insertWrapDetails.js +23 -0
- package/src/assets/jointjs/js/lodash/_isFlattenable.js +20 -0
- package/src/assets/jointjs/js/lodash/_isIndex.js +25 -0
- package/src/assets/jointjs/js/lodash/_isIterateeCall.js +30 -0
- package/src/assets/jointjs/js/lodash/_isKey.js +29 -0
- package/src/assets/jointjs/js/lodash/_isKeyable.js +15 -0
- package/src/assets/jointjs/js/lodash/_isLaziable.js +28 -0
- package/src/assets/jointjs/js/lodash/_isMaskable.js +14 -0
- package/src/assets/jointjs/js/lodash/_isMasked.js +20 -0
- package/src/assets/jointjs/js/lodash/_isPrototype.js +18 -0
- package/src/assets/jointjs/js/lodash/_isStrictComparable.js +15 -0
- package/src/assets/jointjs/js/lodash/_iteratorToArray.js +18 -0
- package/src/assets/jointjs/js/lodash/_lazyClone.js +23 -0
- package/src/assets/jointjs/js/lodash/_lazyReverse.js +23 -0
- package/src/assets/jointjs/js/lodash/_lazyValue.js +69 -0
- package/src/assets/jointjs/js/lodash/_listCacheClear.js +13 -0
- package/src/assets/jointjs/js/lodash/_listCacheDelete.js +35 -0
- package/src/assets/jointjs/js/lodash/_listCacheGet.js +19 -0
- package/src/assets/jointjs/js/lodash/_listCacheHas.js +16 -0
- package/src/assets/jointjs/js/lodash/_listCacheSet.js +26 -0
- package/src/assets/jointjs/js/lodash/_mapCacheClear.js +21 -0
- package/src/assets/jointjs/js/lodash/_mapCacheDelete.js +18 -0
- package/src/assets/jointjs/js/lodash/_mapCacheGet.js +16 -0
- package/src/assets/jointjs/js/lodash/_mapCacheHas.js +16 -0
- package/src/assets/jointjs/js/lodash/_mapCacheSet.js +22 -0
- package/src/assets/jointjs/js/lodash/_mapToArray.js +18 -0
- package/src/assets/jointjs/js/lodash/_matchesStrictComparable.js +20 -0
- package/src/assets/jointjs/js/lodash/_memoizeCapped.js +26 -0
- package/src/assets/jointjs/js/lodash/_mergeData.js +90 -0
- package/src/assets/jointjs/js/lodash/_metaMap.js +6 -0
- package/src/assets/jointjs/js/lodash/_nativeCreate.js +6 -0
- package/src/assets/jointjs/js/lodash/_nativeKeys.js +6 -0
- package/src/assets/jointjs/js/lodash/_nativeKeysIn.js +20 -0
- package/src/assets/jointjs/js/lodash/_nodeUtil.js +30 -0
- package/src/assets/jointjs/js/lodash/_objectToString.js +22 -0
- package/src/assets/jointjs/js/lodash/_overArg.js +15 -0
- package/src/assets/jointjs/js/lodash/_overRest.js +36 -0
- package/src/assets/jointjs/js/lodash/_parent.js +16 -0
- package/src/assets/jointjs/js/lodash/_reEscape.js +4 -0
- package/src/assets/jointjs/js/lodash/_reEvaluate.js +4 -0
- package/src/assets/jointjs/js/lodash/_reInterpolate.js +4 -0
- package/src/assets/jointjs/js/lodash/_realNames.js +4 -0
- package/src/assets/jointjs/js/lodash/_reorder.js +29 -0
- package/src/assets/jointjs/js/lodash/_replaceHolders.js +29 -0
- package/src/assets/jointjs/js/lodash/_root.js +9 -0
- package/src/assets/jointjs/js/lodash/_safeGet.js +21 -0
- package/src/assets/jointjs/js/lodash/_setCacheAdd.js +19 -0
- package/src/assets/jointjs/js/lodash/_setCacheHas.js +14 -0
- package/src/assets/jointjs/js/lodash/_setData.js +20 -0
- package/src/assets/jointjs/js/lodash/_setToArray.js +18 -0
- package/src/assets/jointjs/js/lodash/_setToPairs.js +18 -0
- package/src/assets/jointjs/js/lodash/_setToString.js +14 -0
- package/src/assets/jointjs/js/lodash/_setWrapToString.js +21 -0
- package/src/assets/jointjs/js/lodash/_shortOut.js +37 -0
- package/src/assets/jointjs/js/lodash/_shuffleSelf.js +28 -0
- package/src/assets/jointjs/js/lodash/_stackClear.js +15 -0
- package/src/assets/jointjs/js/lodash/_stackDelete.js +18 -0
- package/src/assets/jointjs/js/lodash/_stackGet.js +14 -0
- package/src/assets/jointjs/js/lodash/_stackHas.js +14 -0
- package/src/assets/jointjs/js/lodash/_stackSet.js +34 -0
- package/src/assets/jointjs/js/lodash/_strictIndexOf.js +23 -0
- package/src/assets/jointjs/js/lodash/_strictLastIndexOf.js +21 -0
- package/src/assets/jointjs/js/lodash/_stringSize.js +18 -0
- package/src/assets/jointjs/js/lodash/_stringToArray.js +18 -0
- package/src/assets/jointjs/js/lodash/_stringToPath.js +27 -0
- package/src/assets/jointjs/js/lodash/_toKey.js +21 -0
- package/src/assets/jointjs/js/lodash/_toSource.js +26 -0
- package/src/assets/jointjs/js/lodash/_unescapeHtmlChar.js +21 -0
- package/src/assets/jointjs/js/lodash/_unicodeSize.js +44 -0
- package/src/assets/jointjs/js/lodash/_unicodeToArray.js +40 -0
- package/src/assets/jointjs/js/lodash/_unicodeWords.js +69 -0
- package/src/assets/jointjs/js/lodash/_updateWrapDetails.js +46 -0
- package/src/assets/jointjs/js/lodash/_wrapperClone.js +23 -0
- package/src/assets/jointjs/js/lodash/add.js +22 -0
- package/src/assets/jointjs/js/lodash/after.js +42 -0
- package/src/assets/jointjs/js/lodash/array.js +67 -0
- package/src/assets/jointjs/js/lodash/ary.js +29 -0
- package/src/assets/jointjs/js/lodash/assign.js +58 -0
- package/src/assets/jointjs/js/lodash/assignIn.js +40 -0
- package/src/assets/jointjs/js/lodash/assignInWith.js +38 -0
- package/src/assets/jointjs/js/lodash/assignWith.js +37 -0
- package/src/assets/jointjs/js/lodash/at.js +23 -0
- package/src/assets/jointjs/js/lodash/attempt.js +35 -0
- package/src/assets/jointjs/js/lodash/before.js +40 -0
- package/src/assets/jointjs/js/lodash/bind.js +57 -0
- package/src/assets/jointjs/js/lodash/bindAll.js +41 -0
- package/src/assets/jointjs/js/lodash/bindKey.js +68 -0
- package/src/assets/jointjs/js/lodash/camelCase.js +29 -0
- package/src/assets/jointjs/js/lodash/capitalize.js +23 -0
- package/src/assets/jointjs/js/lodash/castArray.js +44 -0
- package/src/assets/jointjs/js/lodash/ceil.js +26 -0
- package/src/assets/jointjs/js/lodash/chain.js +38 -0
- package/src/assets/jointjs/js/lodash/chunk.js +50 -0
- package/src/assets/jointjs/js/lodash/clamp.js +39 -0
- package/src/assets/jointjs/js/lodash/clone.js +36 -0
- package/src/assets/jointjs/js/lodash/cloneDeep.js +29 -0
- package/src/assets/jointjs/js/lodash/cloneDeepWith.js +40 -0
- package/src/assets/jointjs/js/lodash/cloneWith.js +42 -0
- package/src/assets/jointjs/js/lodash/collection.js +30 -0
- package/src/assets/jointjs/js/lodash/commit.js +33 -0
- package/src/assets/jointjs/js/lodash/compact.js +31 -0
- package/src/assets/jointjs/js/lodash/concat.js +43 -0
- package/src/assets/jointjs/js/lodash/cond.js +60 -0
- package/src/assets/jointjs/js/lodash/conforms.js +35 -0
- package/src/assets/jointjs/js/lodash/conformsTo.js +32 -0
- package/src/assets/jointjs/js/lodash/constant.js +26 -0
- package/src/assets/jointjs/js/lodash/core.js +3854 -0
- package/src/assets/jointjs/js/lodash/core.min.js +29 -0
- package/src/assets/jointjs/js/lodash/countBy.js +40 -0
- package/src/assets/jointjs/js/lodash/create.js +43 -0
- package/src/assets/jointjs/js/lodash/curry.js +57 -0
- package/src/assets/jointjs/js/lodash/curryRight.js +54 -0
- package/src/assets/jointjs/js/lodash/date.js +3 -0
- package/src/assets/jointjs/js/lodash/debounce.js +191 -0
- package/src/assets/jointjs/js/lodash/deburr.js +45 -0
- package/src/assets/jointjs/js/lodash/defaultTo.js +25 -0
- package/src/assets/jointjs/js/lodash/defaults.js +64 -0
- package/src/assets/jointjs/js/lodash/defaultsDeep.js +30 -0
- package/src/assets/jointjs/js/lodash/defer.js +26 -0
- package/src/assets/jointjs/js/lodash/delay.js +28 -0
- package/src/assets/jointjs/js/lodash/difference.js +33 -0
- package/src/assets/jointjs/js/lodash/differenceBy.js +44 -0
- package/src/assets/jointjs/js/lodash/differenceWith.js +40 -0
- package/src/assets/jointjs/js/lodash/divide.js +22 -0
- package/src/assets/jointjs/js/lodash/drop.js +38 -0
- package/src/assets/jointjs/js/lodash/dropRight.js +39 -0
- package/src/assets/jointjs/js/lodash/dropRightWhile.js +45 -0
- package/src/assets/jointjs/js/lodash/dropWhile.js +45 -0
- package/src/assets/jointjs/js/lodash/each.js +1 -0
- package/src/assets/jointjs/js/lodash/eachRight.js +1 -0
- package/src/assets/jointjs/js/lodash/endsWith.js +43 -0
- package/src/assets/jointjs/js/lodash/entries.js +1 -0
- package/src/assets/jointjs/js/lodash/entriesIn.js +1 -0
- package/src/assets/jointjs/js/lodash/eq.js +37 -0
- package/src/assets/jointjs/js/lodash/escape.js +43 -0
- package/src/assets/jointjs/js/lodash/escapeRegExp.js +32 -0
- package/src/assets/jointjs/js/lodash/every.js +56 -0
- package/src/assets/jointjs/js/lodash/extend.js +1 -0
- package/src/assets/jointjs/js/lodash/extendWith.js +1 -0
- package/src/assets/jointjs/js/lodash/fill.js +45 -0
- package/src/assets/jointjs/js/lodash/filter.js +48 -0
- package/src/assets/jointjs/js/lodash/find.js +42 -0
- package/src/assets/jointjs/js/lodash/findIndex.js +55 -0
- package/src/assets/jointjs/js/lodash/findKey.js +44 -0
- package/src/assets/jointjs/js/lodash/findLast.js +25 -0
- package/src/assets/jointjs/js/lodash/findLastIndex.js +59 -0
- package/src/assets/jointjs/js/lodash/findLastKey.js +44 -0
- package/src/assets/jointjs/js/lodash/first.js +1 -0
- package/src/assets/jointjs/js/lodash/flatMap.js +29 -0
- package/src/assets/jointjs/js/lodash/flatMapDeep.js +31 -0
- package/src/assets/jointjs/js/lodash/flatMapDepth.js +31 -0
- package/src/assets/jointjs/js/lodash/flatten.js +22 -0
- package/src/assets/jointjs/js/lodash/flattenDeep.js +25 -0
- package/src/assets/jointjs/js/lodash/flattenDepth.js +33 -0
- package/src/assets/jointjs/js/lodash/flip.js +28 -0
- package/src/assets/jointjs/js/lodash/floor.js +26 -0
- package/src/assets/jointjs/js/lodash/flow.js +27 -0
- package/src/assets/jointjs/js/lodash/flowRight.js +26 -0
- package/src/assets/jointjs/js/lodash/forEach.js +41 -0
- package/src/assets/jointjs/js/lodash/forEachRight.js +31 -0
- package/src/assets/jointjs/js/lodash/forIn.js +39 -0
- package/src/assets/jointjs/js/lodash/forInRight.js +37 -0
- package/src/assets/jointjs/js/lodash/forOwn.js +36 -0
- package/src/assets/jointjs/js/lodash/forOwnRight.js +34 -0
- package/src/assets/jointjs/js/lodash/fp/F.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/T.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/__.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/_baseConvert.js +569 -0
- package/src/assets/jointjs/js/lodash/fp/_convertBrowser.js +18 -0
- package/src/assets/jointjs/js/lodash/fp/_falseOptions.js +7 -0
- package/src/assets/jointjs/js/lodash/fp/_mapping.js +358 -0
- package/src/assets/jointjs/js/lodash/fp/_util.js +16 -0
- package/src/assets/jointjs/js/lodash/fp/add.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/after.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/all.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/allPass.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/always.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/any.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/anyPass.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/apply.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/array.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/ary.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assign.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignAllWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignInAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignInAllWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignInWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assignWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/assoc.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/assocPath.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/at.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/attempt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/before.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/bind.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/bindAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/bindKey.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/camelCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/capitalize.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/castArray.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/ceil.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/chain.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/chunk.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/clamp.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/clone.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/cloneDeep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/cloneDeepWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/cloneWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/collection.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/commit.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/compact.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/complement.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/compose.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/concat.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/cond.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/conforms.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/conformsTo.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/constant.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/contains.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/convert.js +18 -0
- package/src/assets/jointjs/js/lodash/fp/countBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/create.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/curry.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/curryN.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/curryRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/curryRightN.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/date.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/debounce.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/deburr.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defaultTo.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defaults.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defaultsAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defaultsDeep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defaultsDeepAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/defer.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/delay.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/difference.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/differenceBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/differenceWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/dissoc.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/dissocPath.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/divide.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/drop.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/dropLast.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/dropLastWhile.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/dropRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/dropRightWhile.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/dropWhile.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/each.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/eachRight.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/endsWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/entries.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/entriesIn.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/eq.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/equals.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/escape.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/escapeRegExp.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/every.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/extend.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/extendAll.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/extendAllWith.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/extendWith.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/fill.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/filter.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/find.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findIndex.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findIndexFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findKey.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findLast.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findLastFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findLastIndex.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findLastIndexFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/findLastKey.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/first.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/flatMap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flatMapDeep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flatMapDepth.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flatten.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flattenDeep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flattenDepth.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flip.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/floor.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flow.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/flowRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forEach.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forEachRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forInRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forOwn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/forOwnRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/fromPairs.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/function.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/functions.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/functionsIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/get.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/getOr.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/groupBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/gt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/gte.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/has.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/hasIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/head.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/identical.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/identity.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/inRange.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/includes.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/includesFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/indexBy.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/indexOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/indexOfFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/init.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/initial.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/intersection.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/intersectionBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/intersectionWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invert.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invertBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invertObj.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/invoke.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invokeArgs.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invokeArgsMap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/invokeMap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isArguments.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isArray.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isArrayBuffer.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isArrayLike.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isArrayLikeObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isBoolean.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isBuffer.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isDate.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isElement.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isEmpty.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isEqual.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isEqualWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isError.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isFinite.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isFunction.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isInteger.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isLength.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isMap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isMatch.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isMatchWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isNaN.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isNative.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isNil.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isNull.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isNumber.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isObjectLike.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isPlainObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isRegExp.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isSafeInteger.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isSet.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isString.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isSymbol.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isTypedArray.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isUndefined.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isWeakMap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/isWeakSet.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/iteratee.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/join.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/juxt.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/kebabCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/keyBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/keys.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/keysIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lang.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/last.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lastIndexOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lastIndexOfFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lowerCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lowerFirst.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/lte.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/map.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mapKeys.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mapValues.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/matches.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/matchesProperty.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/math.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/max.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/maxBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mean.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/meanBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/memoize.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/merge.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mergeAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mergeAllWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mergeWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/method.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/methodOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/min.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/minBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/mixin.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/multiply.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/nAry.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/negate.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/next.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/noop.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/now.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/nth.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/nthArg.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/number.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/object.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/omit.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/omitAll.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/omitBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/once.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/orderBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/over.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/overArgs.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/overEvery.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/overSome.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pad.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/padChars.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/padCharsEnd.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/padCharsStart.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/padEnd.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/padStart.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/parseInt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/partial.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/partialRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/partition.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/path.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/pathEq.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/pathOr.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/paths.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/pick.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pickAll.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/pickBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pipe.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/placeholder.js +6 -0
- package/src/assets/jointjs/js/lodash/fp/plant.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pluck.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/prop.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/propEq.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/propOr.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/property.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/propertyOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/props.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/pull.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pullAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pullAllBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pullAllWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/pullAt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/random.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/range.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/rangeRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/rangeStep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/rangeStepRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/rearg.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/reduce.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/reduceRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/reject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/remove.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/repeat.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/replace.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/rest.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/restFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/result.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/reverse.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/round.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sample.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sampleSize.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/seq.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/set.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/setWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/shuffle.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/size.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/slice.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/snakeCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/some.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedIndex.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedIndexBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedIndexOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedLastIndex.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedLastIndexBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedLastIndexOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedUniq.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sortedUniqBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/split.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/spread.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/spreadFrom.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/startCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/startsWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/string.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/stubArray.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/stubFalse.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/stubObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/stubString.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/stubTrue.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/subtract.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sum.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/sumBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/symmetricDifference.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/symmetricDifferenceBy.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/symmetricDifferenceWith.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/tail.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/take.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/takeLast.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/takeLastWhile.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/takeRight.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/takeRightWhile.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/takeWhile.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/tap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/template.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/templateSettings.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/throttle.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/thru.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/times.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toArray.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toFinite.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toInteger.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toIterator.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toJSON.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toLength.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toLower.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toNumber.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toPairs.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toPairsIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toPath.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toPlainObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toSafeInteger.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toString.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/toUpper.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/transform.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trim.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trimChars.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trimCharsEnd.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trimCharsStart.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trimEnd.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/trimStart.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/truncate.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unapply.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/unary.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unescape.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/union.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unionBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unionWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/uniq.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/uniqBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/uniqWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/uniqueId.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unnest.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/unset.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unzip.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/unzipWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/update.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/updateWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/upperCase.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/upperFirst.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/useWith.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/util.js +2 -0
- package/src/assets/jointjs/js/lodash/fp/value.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/valueOf.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/values.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/valuesIn.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/where.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/whereEq.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/without.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/words.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrap.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrapperAt.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrapperChain.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrapperLodash.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrapperReverse.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/wrapperValue.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/xor.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/xorBy.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/xorWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/zip.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/zipAll.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/zipObj.js +1 -0
- package/src/assets/jointjs/js/lodash/fp/zipObject.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/zipObjectDeep.js +5 -0
- package/src/assets/jointjs/js/lodash/fp/zipWith.js +5 -0
- package/src/assets/jointjs/js/lodash/fp.js +2 -0
- package/src/assets/jointjs/js/lodash/fromPairs.js +28 -0
- package/src/assets/jointjs/js/lodash/function.js +25 -0
- package/src/assets/jointjs/js/lodash/functions.js +31 -0
- package/src/assets/jointjs/js/lodash/functionsIn.js +31 -0
- package/src/assets/jointjs/js/lodash/get.js +33 -0
- package/src/assets/jointjs/js/lodash/groupBy.js +41 -0
- package/src/assets/jointjs/js/lodash/gt.js +29 -0
- package/src/assets/jointjs/js/lodash/gte.js +30 -0
- package/src/assets/jointjs/js/lodash/has.js +35 -0
- package/src/assets/jointjs/js/lodash/hasIn.js +34 -0
- package/src/assets/jointjs/js/lodash/head.js +23 -0
- package/src/assets/jointjs/js/lodash/identity.js +21 -0
- package/src/assets/jointjs/js/lodash/inRange.js +55 -0
- package/src/assets/jointjs/js/lodash/includes.js +53 -0
- package/src/assets/jointjs/js/lodash/index.js +1 -0
- package/src/assets/jointjs/js/lodash/indexOf.js +42 -0
- package/src/assets/jointjs/js/lodash/initial.js +22 -0
- package/src/assets/jointjs/js/lodash/intersection.js +30 -0
- package/src/assets/jointjs/js/lodash/intersectionBy.js +45 -0
- package/src/assets/jointjs/js/lodash/intersectionWith.js +41 -0
- package/src/assets/jointjs/js/lodash/invert.js +42 -0
- package/src/assets/jointjs/js/lodash/invertBy.js +56 -0
- package/src/assets/jointjs/js/lodash/invoke.js +24 -0
- package/src/assets/jointjs/js/lodash/invokeMap.js +41 -0
- package/src/assets/jointjs/js/lodash/isArguments.js +36 -0
- package/src/assets/jointjs/js/lodash/isArray.js +26 -0
- package/src/assets/jointjs/js/lodash/isArrayBuffer.js +27 -0
- package/src/assets/jointjs/js/lodash/isArrayLike.js +33 -0
- package/src/assets/jointjs/js/lodash/isArrayLikeObject.js +33 -0
- package/src/assets/jointjs/js/lodash/isBoolean.js +29 -0
- package/src/assets/jointjs/js/lodash/isBuffer.js +38 -0
- package/src/assets/jointjs/js/lodash/isDate.js +27 -0
- package/src/assets/jointjs/js/lodash/isElement.js +25 -0
- package/src/assets/jointjs/js/lodash/isEmpty.js +77 -0
- package/src/assets/jointjs/js/lodash/isEqual.js +35 -0
- package/src/assets/jointjs/js/lodash/isEqualWith.js +41 -0
- package/src/assets/jointjs/js/lodash/isError.js +36 -0
- package/src/assets/jointjs/js/lodash/isFinite.js +36 -0
- package/src/assets/jointjs/js/lodash/isFunction.js +37 -0
- package/src/assets/jointjs/js/lodash/isInteger.js +33 -0
- package/src/assets/jointjs/js/lodash/isLength.js +35 -0
- package/src/assets/jointjs/js/lodash/isMap.js +27 -0
- package/src/assets/jointjs/js/lodash/isMatch.js +36 -0
- package/src/assets/jointjs/js/lodash/isMatchWith.js +41 -0
- package/src/assets/jointjs/js/lodash/isNaN.js +38 -0
- package/src/assets/jointjs/js/lodash/isNative.js +40 -0
- package/src/assets/jointjs/js/lodash/isNil.js +25 -0
- package/src/assets/jointjs/js/lodash/isNull.js +22 -0
- package/src/assets/jointjs/js/lodash/isNumber.js +38 -0
- package/src/assets/jointjs/js/lodash/isObject.js +31 -0
- package/src/assets/jointjs/js/lodash/isObjectLike.js +29 -0
- package/src/assets/jointjs/js/lodash/isPlainObject.js +62 -0
- package/src/assets/jointjs/js/lodash/isRegExp.js +27 -0
- package/src/assets/jointjs/js/lodash/isSafeInteger.js +37 -0
- package/src/assets/jointjs/js/lodash/isSet.js +27 -0
- package/src/assets/jointjs/js/lodash/isString.js +30 -0
- package/src/assets/jointjs/js/lodash/isSymbol.js +29 -0
- package/src/assets/jointjs/js/lodash/isTypedArray.js +27 -0
- package/src/assets/jointjs/js/lodash/isUndefined.js +22 -0
- package/src/assets/jointjs/js/lodash/isWeakMap.js +28 -0
- package/src/assets/jointjs/js/lodash/isWeakSet.js +28 -0
- package/src/assets/jointjs/js/lodash/iteratee.js +53 -0
- package/src/assets/jointjs/js/lodash/join.js +26 -0
- package/src/assets/jointjs/js/lodash/kebabCase.js +28 -0
- package/src/assets/jointjs/js/lodash/keyBy.js +36 -0
- package/src/assets/jointjs/js/lodash/keys.js +37 -0
- package/src/assets/jointjs/js/lodash/keysIn.js +32 -0
- package/src/assets/jointjs/js/lodash/lang.js +58 -0
- package/src/assets/jointjs/js/lodash/last.js +20 -0
- package/src/assets/jointjs/js/lodash/lastIndexOf.js +46 -0
- package/src/assets/jointjs/js/lodash/lodash.js +17112 -0
- package/src/assets/jointjs/js/lodash/lodash.min.js +137 -0
- package/src/assets/jointjs/js/lodash/lowerCase.js +27 -0
- package/src/assets/jointjs/js/lodash/lowerFirst.js +22 -0
- package/src/assets/jointjs/js/lodash/lt.js +29 -0
- package/src/assets/jointjs/js/lodash/lte.js +30 -0
- package/src/assets/jointjs/js/lodash/map.js +53 -0
- package/src/assets/jointjs/js/lodash/mapKeys.js +36 -0
- package/src/assets/jointjs/js/lodash/mapValues.js +43 -0
- package/src/assets/jointjs/js/lodash/matches.js +39 -0
- package/src/assets/jointjs/js/lodash/matchesProperty.js +37 -0
- package/src/assets/jointjs/js/lodash/math.js +17 -0
- package/src/assets/jointjs/js/lodash/max.js +29 -0
- package/src/assets/jointjs/js/lodash/maxBy.js +34 -0
- package/src/assets/jointjs/js/lodash/mean.js +22 -0
- package/src/assets/jointjs/js/lodash/meanBy.js +31 -0
- package/src/assets/jointjs/js/lodash/memoize.js +73 -0
- package/src/assets/jointjs/js/lodash/merge.js +39 -0
- package/src/assets/jointjs/js/lodash/mergeWith.js +39 -0
- package/src/assets/jointjs/js/lodash/method.js +34 -0
- package/src/assets/jointjs/js/lodash/methodOf.js +33 -0
- package/src/assets/jointjs/js/lodash/min.js +29 -0
- package/src/assets/jointjs/js/lodash/minBy.js +34 -0
- package/src/assets/jointjs/js/lodash/mixin.js +74 -0
- package/src/assets/jointjs/js/lodash/multiply.js +22 -0
- package/src/assets/jointjs/js/lodash/negate.js +40 -0
- package/src/assets/jointjs/js/lodash/next.js +35 -0
- package/src/assets/jointjs/js/lodash/noop.js +17 -0
- package/src/assets/jointjs/js/lodash/now.js +23 -0
- package/src/assets/jointjs/js/lodash/nth.js +29 -0
- package/src/assets/jointjs/js/lodash/nthArg.js +32 -0
- package/src/assets/jointjs/js/lodash/number.js +5 -0
- package/src/assets/jointjs/js/lodash/object.js +49 -0
- package/src/assets/jointjs/js/lodash/omit.js +57 -0
- package/src/assets/jointjs/js/lodash/omitBy.js +29 -0
- package/src/assets/jointjs/js/lodash/once.js +25 -0
- package/src/assets/jointjs/js/lodash/orderBy.js +47 -0
- package/src/assets/jointjs/js/lodash/org.js +39 -0
- package/src/assets/jointjs/js/lodash/over.js +24 -0
- package/src/assets/jointjs/js/lodash/overArgs.js +61 -0
- package/src/assets/jointjs/js/lodash/overEvery.js +30 -0
- package/src/assets/jointjs/js/lodash/overSome.js +30 -0
- package/src/assets/jointjs/js/lodash/package.json +1 -0
- package/src/assets/jointjs/js/lodash/pad.js +49 -0
- package/src/assets/jointjs/js/lodash/padEnd.js +39 -0
- package/src/assets/jointjs/js/lodash/padStart.js +39 -0
- package/src/assets/jointjs/js/lodash/parseInt.js +43 -0
- package/src/assets/jointjs/js/lodash/partial.js +50 -0
- package/src/assets/jointjs/js/lodash/partialRight.js +49 -0
- package/src/assets/jointjs/js/lodash/partition.js +43 -0
- package/src/assets/jointjs/js/lodash/pick.js +25 -0
- package/src/assets/jointjs/js/lodash/pickBy.js +37 -0
- package/src/assets/jointjs/js/lodash/plant.js +48 -0
- package/src/assets/jointjs/js/lodash/property.js +32 -0
- package/src/assets/jointjs/js/lodash/propertyOf.js +30 -0
- package/src/assets/jointjs/js/lodash/pull.js +29 -0
- package/src/assets/jointjs/js/lodash/pullAll.js +29 -0
- package/src/assets/jointjs/js/lodash/pullAllBy.js +33 -0
- package/src/assets/jointjs/js/lodash/pullAllWith.js +32 -0
- package/src/assets/jointjs/js/lodash/pullAt.js +43 -0
- package/src/assets/jointjs/js/lodash/random.js +82 -0
- package/src/assets/jointjs/js/lodash/range.js +46 -0
- package/src/assets/jointjs/js/lodash/rangeRight.js +41 -0
- package/src/assets/jointjs/js/lodash/rearg.js +33 -0
- package/src/assets/jointjs/js/lodash/reduce.js +51 -0
- package/src/assets/jointjs/js/lodash/reduceRight.js +36 -0
- package/src/assets/jointjs/js/lodash/reject.js +46 -0
- package/src/assets/jointjs/js/lodash/remove.js +53 -0
- package/src/assets/jointjs/js/lodash/repeat.js +37 -0
- package/src/assets/jointjs/js/lodash/replace.js +29 -0
- package/src/assets/jointjs/js/lodash/rest.js +40 -0
- package/src/assets/jointjs/js/lodash/result.js +56 -0
- package/src/assets/jointjs/js/lodash/reverse.js +34 -0
- package/src/assets/jointjs/js/lodash/round.js +26 -0
- package/src/assets/jointjs/js/lodash/sample.js +24 -0
- package/src/assets/jointjs/js/lodash/sampleSize.js +37 -0
- package/src/assets/jointjs/js/lodash/seq.js +16 -0
- package/src/assets/jointjs/js/lodash/set.js +35 -0
- package/src/assets/jointjs/js/lodash/setWith.js +32 -0
- package/src/assets/jointjs/js/lodash/shuffle.js +25 -0
- package/src/assets/jointjs/js/lodash/size.js +46 -0
- package/src/assets/jointjs/js/lodash/slice.js +37 -0
- package/src/assets/jointjs/js/lodash/snakeCase.js +28 -0
- package/src/assets/jointjs/js/lodash/some.js +51 -0
- package/src/assets/jointjs/js/lodash/sortBy.js +48 -0
- package/src/assets/jointjs/js/lodash/sortedIndex.js +24 -0
- package/src/assets/jointjs/js/lodash/sortedIndexBy.js +33 -0
- package/src/assets/jointjs/js/lodash/sortedIndexOf.js +31 -0
- package/src/assets/jointjs/js/lodash/sortedLastIndex.js +25 -0
- package/src/assets/jointjs/js/lodash/sortedLastIndexBy.js +33 -0
- package/src/assets/jointjs/js/lodash/sortedLastIndexOf.js +31 -0
- package/src/assets/jointjs/js/lodash/sortedUniq.js +24 -0
- package/src/assets/jointjs/js/lodash/sortedUniqBy.js +26 -0
- package/src/assets/jointjs/js/lodash/split.js +52 -0
- package/src/assets/jointjs/js/lodash/spread.js +63 -0
- package/src/assets/jointjs/js/lodash/startCase.js +29 -0
- package/src/assets/jointjs/js/lodash/startsWith.js +39 -0
- package/src/assets/jointjs/js/lodash/string.js +33 -0
- package/src/assets/jointjs/js/lodash/stubArray.js +23 -0
- package/src/assets/jointjs/js/lodash/stubFalse.js +18 -0
- package/src/assets/jointjs/js/lodash/stubObject.js +23 -0
- package/src/assets/jointjs/js/lodash/stubString.js +18 -0
- package/src/assets/jointjs/js/lodash/stubTrue.js +18 -0
- package/src/assets/jointjs/js/lodash/subtract.js +22 -0
- package/src/assets/jointjs/js/lodash/sum.js +24 -0
- package/src/assets/jointjs/js/lodash/sumBy.js +33 -0
- package/src/assets/jointjs/js/lodash/tag.js +43 -0
- package/src/assets/jointjs/js/lodash/tail.js +22 -0
- package/src/assets/jointjs/js/lodash/take.js +37 -0
- package/src/assets/jointjs/js/lodash/takeRight.js +39 -0
- package/src/assets/jointjs/js/lodash/takeRightWhile.js +45 -0
- package/src/assets/jointjs/js/lodash/takeWhile.js +45 -0
- package/src/assets/jointjs/js/lodash/tap.js +29 -0
- package/src/assets/jointjs/js/lodash/template.js +253 -0
- package/src/assets/jointjs/js/lodash/templateSettings.js +67 -0
- package/src/assets/jointjs/js/lodash/throttle.js +69 -0
- package/src/assets/jointjs/js/lodash/thru.js +28 -0
- package/src/assets/jointjs/js/lodash/times.js +51 -0
- package/src/assets/jointjs/js/lodash/toArray.js +58 -0
- package/src/assets/jointjs/js/lodash/toFinite.js +42 -0
- package/src/assets/jointjs/js/lodash/toInteger.js +36 -0
- package/src/assets/jointjs/js/lodash/toIterator.js +23 -0
- package/src/assets/jointjs/js/lodash/toJSON.js +1 -0
- package/src/assets/jointjs/js/lodash/toLength.js +38 -0
- package/src/assets/jointjs/js/lodash/toLower.js +28 -0
- package/src/assets/jointjs/js/lodash/toNumber.js +66 -0
- package/src/assets/jointjs/js/lodash/toPairs.js +30 -0
- package/src/assets/jointjs/js/lodash/toPairsIn.js +30 -0
- package/src/assets/jointjs/js/lodash/toPath.js +33 -0
- package/src/assets/jointjs/js/lodash/toPlainObject.js +32 -0
- package/src/assets/jointjs/js/lodash/toSafeInteger.js +37 -0
- package/src/assets/jointjs/js/lodash/toString.js +28 -0
- package/src/assets/jointjs/js/lodash/toUpper.js +28 -0
- package/src/assets/jointjs/js/lodash/transform.js +65 -0
- package/src/assets/jointjs/js/lodash/trim.js +49 -0
- package/src/assets/jointjs/js/lodash/trimEnd.js +43 -0
- package/src/assets/jointjs/js/lodash/trimStart.js +43 -0
- package/src/assets/jointjs/js/lodash/truncate.js +111 -0
- package/src/assets/jointjs/js/lodash/unary.js +22 -0
- package/src/assets/jointjs/js/lodash/unescape.js +34 -0
- package/src/assets/jointjs/js/lodash/union.js +26 -0
- package/src/assets/jointjs/js/lodash/unionBy.js +39 -0
- package/src/assets/jointjs/js/lodash/unionWith.js +34 -0
- package/src/assets/jointjs/js/lodash/uniq.js +25 -0
- package/src/assets/jointjs/js/lodash/uniqBy.js +31 -0
- package/src/assets/jointjs/js/lodash/uniqWith.js +28 -0
- package/src/assets/jointjs/js/lodash/uniqueId.js +28 -0
- package/src/assets/jointjs/js/lodash/unset.js +34 -0
- package/src/assets/jointjs/js/lodash/unzip.js +45 -0
- package/src/assets/jointjs/js/lodash/unzipWith.js +39 -0
- package/src/assets/jointjs/js/lodash/update.js +35 -0
- package/src/assets/jointjs/js/lodash/updateWith.js +33 -0
- package/src/assets/jointjs/js/lodash/upperCase.js +27 -0
- package/src/assets/jointjs/js/lodash/upperFirst.js +22 -0
- package/src/assets/jointjs/js/lodash/util.js +34 -0
- package/src/assets/jointjs/js/lodash/value.js +1 -0
- package/src/assets/jointjs/js/lodash/valueOf.js +1 -0
- package/src/assets/jointjs/js/lodash/values.js +34 -0
- package/src/assets/jointjs/js/lodash/valuesIn.js +32 -0
- package/src/assets/jointjs/js/lodash/without.js +31 -0
- package/src/assets/jointjs/js/lodash/words.js +35 -0
- package/src/assets/jointjs/js/lodash/wrap.js +30 -0
- package/src/assets/jointjs/js/lodash/wrapperAt.js +48 -0
- package/src/assets/jointjs/js/lodash/wrapperChain.js +34 -0
- package/src/assets/jointjs/js/lodash/wrapperLodash.js +147 -0
- package/src/assets/jointjs/js/lodash/wrapperReverse.js +44 -0
- package/src/assets/jointjs/js/lodash/wrapperValue.js +21 -0
- package/src/assets/jointjs/js/lodash/xor.js +28 -0
- package/src/assets/jointjs/js/lodash/xorBy.js +39 -0
- package/src/assets/jointjs/js/lodash/xorWith.js +34 -0
- package/src/assets/jointjs/js/lodash/zip.js +22 -0
- package/src/assets/jointjs/js/lodash/zipObject.js +24 -0
- package/src/assets/jointjs/js/lodash/zipObjectDeep.js +23 -0
- package/src/assets/jointjs/js/lodash/zipWith.js +32 -0
- package/src/assets/jointjs/js/rappid.js +65022 -0
- package/src/assets/jointjs/scss/bpmn.scss +884 -0
- package/src/assets/jointjs/scss/rappid.scss +8879 -0
- package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +2 -2
- package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
- package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +7 -4
- package/src/assets/qms-ckeditor-plugin/src/plugins/bpmn/qmsCKEditorBpmnPlugin.js +63 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorConstant.js +9 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorService.js +20 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/converters.js +378 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemap.js +14 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapediting.js +183 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapui.js +49 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/insertimagemapcommand.js +127 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/resizeimagemapcommand.js +82 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/utils.js +234 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkediting.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkimage.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkactionsview.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkformview.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/inserttooltipcommand.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/tooltipediting.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/ui/actionsview.js +1 -1
- package/src/assets/qms-ckeditor-plugin/src/themes/icons/bpmn.svg +20 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/icons/imagemap.svg +56 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/anchor.css +0 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/link.css +0 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkactions.css +0 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkform.css +0 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkimage.css +0 -0
- package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/tooltip.css +0 -0
- package/src/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.scss +156 -0
- package/src/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.scss +0 -0
- package/src/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.scss +27 -0
- package/src/lib/qms-ckeditor-components/styles/_modules.scss +19 -1
- package/src/themes/_color.scss +8 -0
- package/src/themes/core/_colors.scss +2 -0
- package/src/themes/core/_side-sheet.scss +1 -0
- package/src/themes/core/_tab.scss +50 -49
@@ -0,0 +1,1948 @@
|
|
1
|
+
/**
|
2
|
+
* Image Map Editor (imgmap) - in-browser imagemap editor
|
3
|
+
* Copyright (C) 2006 - 2008 Adam Maschek (adam.maschek @ gmail.com)
|
4
|
+
*
|
5
|
+
* This program is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU General Public License
|
7
|
+
* as published by the Free Software Foundation; either version 2
|
8
|
+
* of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
* GNU General Public License for more details.
|
14
|
+
*
|
15
|
+
* You should have received a copy of the GNU General Public License
|
16
|
+
* along with this program; if not, write to the Free Software
|
17
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
18
|
+
*/
|
19
|
+
/**
|
20
|
+
* @fileoverview
|
21
|
+
* Online Image Map Editor - main script file.
|
22
|
+
* This is the main script file of the Online Image Map Editor.
|
23
|
+
*
|
24
|
+
* @date 26-02-2007 2:24:50
|
25
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
26
|
+
* @copyright
|
27
|
+
* @version 2.2
|
28
|
+
*
|
29
|
+
*/
|
30
|
+
/*jslint browser: true, newcap: false, white: false, onevar: false, plusplus: false, eqeqeq: false, nomen: false */
|
31
|
+
/*global imgmapStrings:true, window:false, G_vmlCanvasManager:false */
|
32
|
+
export class QMSCKEditorImageMapLib {
|
33
|
+
constructor(options) {
|
34
|
+
/** Version string of imgmap */
|
35
|
+
this.version = "2.2";
|
36
|
+
/** Build date of imgmap */
|
37
|
+
this.buildDate = "2009/08/12 22:18";
|
38
|
+
/** Sequential build number of imgmap */
|
39
|
+
this.buildNumber = "113";
|
40
|
+
/** Status flag to indicate current drawing mode */
|
41
|
+
this.is_drawing = 0;
|
42
|
+
/** Array to hold language strings */
|
43
|
+
this.strings = [];
|
44
|
+
/** Helper array for some drawing operations */
|
45
|
+
this.memory = [];
|
46
|
+
/** Array to hold reference to all areas (canvases) */
|
47
|
+
this.areas = [];
|
48
|
+
/** Associative array to hold bound event handlers */
|
49
|
+
this.eventHandlers = {};
|
50
|
+
this.currentid = 0;
|
51
|
+
this.draggedId = null;
|
52
|
+
this.selectedId = null;
|
53
|
+
this.nextShape = 'rect';
|
54
|
+
/** Callback events that you can handle in your GUI. */
|
55
|
+
this.event_types = [
|
56
|
+
'onAddArea',
|
57
|
+
'onRemoveArea',
|
58
|
+
'onDrawArea',
|
59
|
+
'onResizeArea',
|
60
|
+
'onMoveArea',
|
61
|
+
'onLoadImage',
|
62
|
+
'onSelectArea',
|
63
|
+
'onStatusMessage',
|
64
|
+
'onAreaChanged'
|
65
|
+
];
|
66
|
+
this.isLoaded = false;
|
67
|
+
/** holds the name of the actively edited map, use getMapName to read it */
|
68
|
+
this.mapname = '';
|
69
|
+
/** holds the id of the actively edited map, use getMapIdto read it */
|
70
|
+
this.mapid = '';
|
71
|
+
/** global scale of areas (1-normal, 2-doubled, 0.5-half, etc.) */
|
72
|
+
this.globalscale = 1;
|
73
|
+
/** is_drawing draw mode constant */
|
74
|
+
this.DM_RECTANGLE_DRAW = 1;
|
75
|
+
/** is_drawing draw mode constant */
|
76
|
+
this.DM_RECTANGLE_MOVE = 11;
|
77
|
+
/** is_drawing draw mode constant */
|
78
|
+
this.DM_RECTANGLE_RESIZE_TOP = 12;
|
79
|
+
/** is_drawing draw mode constant */
|
80
|
+
this.DM_RECTANGLE_RESIZE_RIGHT = 13;
|
81
|
+
/** is_drawing draw mode constant */
|
82
|
+
this.DM_RECTANGLE_RESIZE_BOTTOM = 14;
|
83
|
+
/** is_drawing draw mode constant */
|
84
|
+
this.DM_RECTANGLE_RESIZE_LEFT = 15;
|
85
|
+
/** is_drawing draw mode constant */
|
86
|
+
this.DM_SQUARE_DRAW = 2;
|
87
|
+
/** is_drawing draw mode constant */
|
88
|
+
this.DM_SQUARE_MOVE = 21;
|
89
|
+
/** is_drawing draw mode constant */
|
90
|
+
this.DM_SQUARE_RESIZE_TOP = 22;
|
91
|
+
/** is_drawing draw mode constant */
|
92
|
+
this.DM_SQUARE_RESIZE_RIGHT = 23;
|
93
|
+
/** is_drawing draw mode constant */
|
94
|
+
this.DM_SQUARE_RESIZE_BOTTOM = 24;
|
95
|
+
/** is_drawing draw mode constant */
|
96
|
+
this.DM_SQUARE_RESIZE_LEFT = 25;
|
97
|
+
/** is_drawing draw mode constant */
|
98
|
+
this.DM_POLYGON_DRAW = 3;
|
99
|
+
/** is_drawing draw mode constant */
|
100
|
+
this.DM_POLYGON_LASTDRAW = 30;
|
101
|
+
/** is_drawing draw mode constant */
|
102
|
+
this.DM_POLYGON_MOVE = 31;
|
103
|
+
//browser sniff
|
104
|
+
this.isMSIE = false;
|
105
|
+
this.isSafari = false;
|
106
|
+
/**
|
107
|
+
* Main setup function.
|
108
|
+
* Can be called manually or constructor will call it.
|
109
|
+
* @date 22-02-2007 0:15:42
|
110
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
111
|
+
* @param config config object
|
112
|
+
* @return True if all went ok.
|
113
|
+
*/
|
114
|
+
this.setup = function (options) {
|
115
|
+
//copy non-default options parameters to this.config
|
116
|
+
for (var i in options) {
|
117
|
+
if (options.hasOwnProperty(i)) {
|
118
|
+
this.config[i] = options[i];
|
119
|
+
}
|
120
|
+
}
|
121
|
+
//set document event hooks
|
122
|
+
this.addEvent(document, 'keydown', this.eventHandlers.doc_keydown = this.doc_keydown.bind(this));
|
123
|
+
this.addEvent(document, 'keyup', this.eventHandlers.doc_keyup = this.doc_keyup.bind(this));
|
124
|
+
this.addEvent(document, 'mousedown', this.eventHandlers.doc_mousedown = this.doc_mousedown.bind(this));
|
125
|
+
//set imageElement element - supposedly it already exists in the DOM
|
126
|
+
this.imageElement = options.imageElement;
|
127
|
+
if (!this.imageElement) {
|
128
|
+
throw 'The image element must be existed in the DOM';
|
129
|
+
}
|
130
|
+
if (!this.imageElement.parentElement) {
|
131
|
+
throw 'The parent of the image element must be existed in the DOM';
|
132
|
+
}
|
133
|
+
this.parentImageElement = this.imageElement.parentElement;
|
134
|
+
this.disableSelection(this.parentImageElement);
|
135
|
+
//wipe all
|
136
|
+
this.removeAllAreas();
|
137
|
+
//reset scale
|
138
|
+
this.globalscale = 1;
|
139
|
+
//setup events
|
140
|
+
this.addEvent(this.imageElement, "dragstart", this.eventHandlers.img_dragstart = this.img_dragstart.bind(this));
|
141
|
+
this.addEvent(this.imageElement, 'mousedown', this.eventHandlers.img_mousedown = this.img_mousedown.bind(this));
|
142
|
+
this.addEvent(this.imageElement, 'mouseup', this.eventHandlers.img_mouseup = this.img_mouseup.bind(this));
|
143
|
+
this.addEvent(this.imageElement, 'mousemove', this.eventHandlers.img_mousemove = this.img_mousemove.bind(this));
|
144
|
+
this.imageElement.style.cursor = this.config.cursor_default;
|
145
|
+
//Load strings from a key:value object
|
146
|
+
if (options.strings) {
|
147
|
+
for (var key in options.strings) {
|
148
|
+
if (options.strings.hasOwnProperty(key)) {
|
149
|
+
this.strings[key] = options.strings[key];
|
150
|
+
}
|
151
|
+
}
|
152
|
+
}
|
153
|
+
//validate event hooks
|
154
|
+
var found, j, le;
|
155
|
+
for (i in this.config.custom_callbacks) {
|
156
|
+
if (this.config.custom_callbacks.hasOwnProperty(i)) {
|
157
|
+
found = false;
|
158
|
+
for (j = 0, le = this.event_types.length; j < le; j++) {
|
159
|
+
if (i == this.event_types[j]) {
|
160
|
+
found = true;
|
161
|
+
break;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
//TODO: remove invalid callback
|
165
|
+
if (!found) {
|
166
|
+
this.log("Unknown custom callback: " + i, 1);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
return true;
|
171
|
+
};
|
172
|
+
/**
|
173
|
+
* Attach new 'evt' event handler 'callback' to 'obj'
|
174
|
+
* @date 24-02-2007 21:16:20
|
175
|
+
* @param obj The object on which the handler is defined.
|
176
|
+
* @param evt The name of the event, like mousedown.
|
177
|
+
* @param callback The callback function (named if you want it to be removed).
|
178
|
+
*/
|
179
|
+
this.addEvent = function (obj, evt, callback) {
|
180
|
+
if (obj.addEventListener) {
|
181
|
+
//W3C style model
|
182
|
+
obj.addEventListener(evt, callback, false);
|
183
|
+
return true;
|
184
|
+
}
|
185
|
+
else {
|
186
|
+
//Microsoft style registration model
|
187
|
+
return obj.attachEvent("on" + evt, callback);
|
188
|
+
}
|
189
|
+
};
|
190
|
+
/**
|
191
|
+
* Detach 'evt' event handled by 'callback' from 'obj' object.
|
192
|
+
* Callback must be a non anonymous function, see eventHandlers.
|
193
|
+
* @see #eventHandlers
|
194
|
+
* Example: myimgmap.removeEvent(myimgmap.pic, 'mousedown', myimgmap.eventHandlers.img_mousedown);
|
195
|
+
* @date 24-11-2007 15:22:17
|
196
|
+
* @param obj The object on which the handler is defined.
|
197
|
+
* @param evt The name of the event, like mousedown.
|
198
|
+
* @param callback The named callback function.
|
199
|
+
*/
|
200
|
+
this.removeEvent = function (obj, evt, callback) {
|
201
|
+
if (obj.removeEventListener) {
|
202
|
+
//W3C style model
|
203
|
+
obj.removeEventListener(evt, callback, false);
|
204
|
+
return true;
|
205
|
+
}
|
206
|
+
else {
|
207
|
+
//Microsoft style detach model
|
208
|
+
return obj.detachEvent("on" + evt, callback);
|
209
|
+
}
|
210
|
+
};
|
211
|
+
/**
|
212
|
+
* Fires custom hook onStatusMessage, passing the status string.
|
213
|
+
* Use this to update your GUI.
|
214
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
215
|
+
* @date 26-07-2008 13:22:54
|
216
|
+
* @param str The status string
|
217
|
+
*/
|
218
|
+
this.statusMessage = function (str) {
|
219
|
+
this.fireEvent('onStatusMessage', str);
|
220
|
+
};
|
221
|
+
/**
|
222
|
+
* Adds basic logging functionality using firebug console object if available.
|
223
|
+
* @date 20-02-2007 17:55:18
|
224
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
225
|
+
* @param obj The object or string you want to debug/echo.
|
226
|
+
*/
|
227
|
+
this.log = function (obj, level) {
|
228
|
+
};
|
229
|
+
/**
|
230
|
+
* Get the map name of the current imagemap.
|
231
|
+
* If doesnt exist, nor map id, generate a new name based on timestamp.
|
232
|
+
* The most portable solution is to use the same value for id and name.
|
233
|
+
* This also conforms the HTML 5 specification, that says:
|
234
|
+
* "If the id attribute is also specified, both attributes must have the same value."
|
235
|
+
* @link http://www.w3.org/html/wg/html5/#the-map-element
|
236
|
+
* @author adam
|
237
|
+
* @see #getMapId
|
238
|
+
* @return The name of the map.
|
239
|
+
*/
|
240
|
+
this.getMapName = function () {
|
241
|
+
if (!this.mapname) {
|
242
|
+
if (!!this.mapid) {
|
243
|
+
return this.mapid;
|
244
|
+
}
|
245
|
+
var now = new Date();
|
246
|
+
this.mapname = 'imagemap' + now.getFullYear() + (now.getMonth() + 1) + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds();
|
247
|
+
}
|
248
|
+
return this.mapname;
|
249
|
+
};
|
250
|
+
/**
|
251
|
+
* Get the map id of the current imagemap.
|
252
|
+
* If doesnt exist, use map name.
|
253
|
+
* @author adam
|
254
|
+
* @see #getMapName
|
255
|
+
* @return The id of the map.
|
256
|
+
*/
|
257
|
+
this.getMapId = function () {
|
258
|
+
if (!this.mapid) {
|
259
|
+
this.mapid = this.getMapName();
|
260
|
+
}
|
261
|
+
return this.mapid;
|
262
|
+
};
|
263
|
+
this.getMapJson = function () {
|
264
|
+
var mapJson = {
|
265
|
+
name: this.getMapName(),
|
266
|
+
id: this.getMapId(),
|
267
|
+
areas: []
|
268
|
+
};
|
269
|
+
for (var i = 0; i < this.areas.length; i++) {
|
270
|
+
const area = this.areas[i];
|
271
|
+
if (area && area.lastInput && area.shape) {
|
272
|
+
const areaJson = {
|
273
|
+
coords: area.lastInput,
|
274
|
+
shape: area.shape,
|
275
|
+
target: area.atarget,
|
276
|
+
alt: area.aalt,
|
277
|
+
href: area.ahref
|
278
|
+
};
|
279
|
+
mapJson.areas.push(areaJson);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
return mapJson;
|
283
|
+
};
|
284
|
+
/**
|
285
|
+
* Convert wild shape names to normal ones.
|
286
|
+
* @date 25-12-2008 19:27:06
|
287
|
+
* @param shape The name of the shape to convert.
|
288
|
+
* @return The normalized shape name, rect as default.
|
289
|
+
*/
|
290
|
+
this._normShape = function (shape) {
|
291
|
+
if (!shape) {
|
292
|
+
return 'rect';
|
293
|
+
}
|
294
|
+
shape = trim(shape).toLowerCase();
|
295
|
+
if (shape.substring(0, 4) == 'rect') {
|
296
|
+
return 'rect';
|
297
|
+
}
|
298
|
+
if (shape.substring(0, 4) == 'circ') {
|
299
|
+
return 'circle';
|
300
|
+
}
|
301
|
+
if (shape.substring(0, 4) == 'poly') {
|
302
|
+
return 'poly';
|
303
|
+
}
|
304
|
+
return 'rect';
|
305
|
+
};
|
306
|
+
/**
|
307
|
+
* Try to normalize coordinates that came from:
|
308
|
+
* 1. html textarea
|
309
|
+
* 2. user input in the active area's input field
|
310
|
+
* 3. from the html source in case of plugins or highlighter
|
311
|
+
* Example of inputs that need to be handled:
|
312
|
+
* 035,035 075,062
|
313
|
+
* 150,217, 190,257, 150,297,110,257
|
314
|
+
* @author adam
|
315
|
+
* @param coords The coordinates in a string.
|
316
|
+
* @param shape The shape of the object (rect, circle, poly).
|
317
|
+
* @param flag Flags that modify the operation. (fromcircle, frompoly, fromrect, preserve)
|
318
|
+
* @returns The normalized coordinates.
|
319
|
+
*/
|
320
|
+
this._normCoords = function (coords, shape, flag) {
|
321
|
+
//function level var declarations
|
322
|
+
var i; //generic cycle counter
|
323
|
+
var sx; //smallest x
|
324
|
+
var sy; //smallest y
|
325
|
+
var gx; //greatest x
|
326
|
+
var gy; //greatest y
|
327
|
+
var temp, le;
|
328
|
+
coords = trim(coords);
|
329
|
+
if (coords === '') {
|
330
|
+
return '';
|
331
|
+
}
|
332
|
+
var oldcoords = coords;
|
333
|
+
//replace some general junk
|
334
|
+
coords = coords.replace(/(\d)([^\d\.])+(\d)/g, "$1,$3"); // Other software might create decimal points, respect them
|
335
|
+
coords = coords.replace(/,\D+(\d)/g, ",$1"); //cut leading junk
|
336
|
+
coords = coords.replace(/,0+(\d)/g, ",$1"); //cut leading zeros
|
337
|
+
coords = coords.replace(/(\d)(\D)+,/g, "$1,");
|
338
|
+
coords = coords.replace(/^\D+(\d)/g, "$1"); //cut leading junk
|
339
|
+
coords = coords.replace(/^0+(\d)/g, "$1"); //cut leading zeros
|
340
|
+
coords = coords.replace(/(\d)(\D)+$/g, "$1"); //cut trailing junk
|
341
|
+
//now fix other issues
|
342
|
+
var parts = coords.split(',');
|
343
|
+
if (shape == 'rect') {
|
344
|
+
if (flag == 'fromcircle') {
|
345
|
+
var r = parts[2];
|
346
|
+
parts[0] = parts[0] - r;
|
347
|
+
parts[1] = parts[1] - r;
|
348
|
+
parts[2] = parseInt(parts[0], 10) + 2 * r;
|
349
|
+
parts[3] = parseInt(parts[1], 10) + 2 * r;
|
350
|
+
}
|
351
|
+
else if (flag == 'frompoly') {
|
352
|
+
sx = parseInt(parts[0], 10);
|
353
|
+
gx = parseInt(parts[0], 10);
|
354
|
+
sy = parseInt(parts[1], 10);
|
355
|
+
gy = parseInt(parts[1], 10);
|
356
|
+
for (i = 0, le = parts.length; i < le; i++) {
|
357
|
+
if (i % 2 === 0 && parseInt(parts[i], 10) < sx) {
|
358
|
+
sx = parseInt(parts[i], 10);
|
359
|
+
}
|
360
|
+
if (i % 2 === 1 && parseInt(parts[i], 10) < sy) {
|
361
|
+
sy = parseInt(parts[i], 10);
|
362
|
+
}
|
363
|
+
if (i % 2 === 0 && parseInt(parts[i], 10) > gx) {
|
364
|
+
gx = parseInt(parts[i], 10);
|
365
|
+
}
|
366
|
+
if (i % 2 === 1 && parseInt(parts[i], 10) > gy) {
|
367
|
+
gy = parseInt(parts[i], 10);
|
368
|
+
}
|
369
|
+
}
|
370
|
+
parts[0] = sx;
|
371
|
+
parts[1] = sy;
|
372
|
+
parts[2] = gx;
|
373
|
+
parts[3] = gy;
|
374
|
+
}
|
375
|
+
if (!(parseInt(parts[1], 10) >= 0)) {
|
376
|
+
parts[1] = parts[0];
|
377
|
+
}
|
378
|
+
if (!(parseInt(parts[2], 10) >= 0)) {
|
379
|
+
parts[2] = parseInt(parts[0], 10) + 10;
|
380
|
+
}
|
381
|
+
if (!(parseInt(parts[3], 10) >= 0)) {
|
382
|
+
parts[3] = parseInt(parts[1], 10) + 10;
|
383
|
+
}
|
384
|
+
if (parseInt(parts[0], 10) > parseInt(parts[2], 10)) {
|
385
|
+
temp = parts[0];
|
386
|
+
parts[0] = parts[2];
|
387
|
+
parts[2] = temp;
|
388
|
+
}
|
389
|
+
if (parseInt(parts[1], 10) > parseInt(parts[3], 10)) {
|
390
|
+
temp = parts[1];
|
391
|
+
parts[1] = parts[3];
|
392
|
+
parts[3] = temp;
|
393
|
+
}
|
394
|
+
coords = parts[0] + "," + parts[1] + "," + parts[2] + "," + parts[3];
|
395
|
+
}
|
396
|
+
else if (shape == 'circle') {
|
397
|
+
if (flag == 'fromrect') {
|
398
|
+
sx = parseInt(parts[0], 10);
|
399
|
+
gx = parseInt(parts[2], 10);
|
400
|
+
sy = parseInt(parts[1], 10);
|
401
|
+
gy = parseInt(parts[3], 10);
|
402
|
+
//use smaller side
|
403
|
+
parts[2] = (gx - sx < gy - sy) ? gx - sx : gy - sy;
|
404
|
+
parts[2] = Math.floor(parts[2] / 2); //radius
|
405
|
+
parts[0] = sx + parts[2];
|
406
|
+
parts[1] = sy + parts[2];
|
407
|
+
}
|
408
|
+
else if (flag == 'frompoly') {
|
409
|
+
sx = parseInt(parts[0], 10);
|
410
|
+
gx = parseInt(parts[0], 10);
|
411
|
+
sy = parseInt(parts[1], 10);
|
412
|
+
gy = parseInt(parts[1], 10);
|
413
|
+
for (i = 0, le = parts.length; i < le; i++) {
|
414
|
+
if (i % 2 === 0 && parseInt(parts[i], 10) < sx) {
|
415
|
+
sx = parseInt(parts[i], 10);
|
416
|
+
}
|
417
|
+
if (i % 2 === 1 && parseInt(parts[i], 10) < sy) {
|
418
|
+
sy = parseInt(parts[i], 10);
|
419
|
+
}
|
420
|
+
if (i % 2 === 0 && parseInt(parts[i], 10) > gx) {
|
421
|
+
gx = parseInt(parts[i], 10);
|
422
|
+
}
|
423
|
+
if (i % 2 === 1 && parseInt(parts[i], 10) > gy) {
|
424
|
+
gy = parseInt(parts[i], 10);
|
425
|
+
}
|
426
|
+
}
|
427
|
+
//use smaller side
|
428
|
+
parts[2] = (gx - sx < gy - sy) ? gx - sx : gy - sy;
|
429
|
+
parts[2] = Math.floor(parts[2] / 2); //radius
|
430
|
+
parts[0] = sx + parts[2];
|
431
|
+
parts[1] = sy + parts[2];
|
432
|
+
}
|
433
|
+
if (!(parseInt(parts[1], 10) > 0)) {
|
434
|
+
parts[1] = parts[0];
|
435
|
+
}
|
436
|
+
if (!(parseInt(parts[2], 10) > 0)) {
|
437
|
+
parts[2] = 10;
|
438
|
+
}
|
439
|
+
coords = parts[0] + "," + parts[1] + "," + parts[2];
|
440
|
+
}
|
441
|
+
else if (shape == 'poly') {
|
442
|
+
if (flag == 'fromrect') {
|
443
|
+
parts[4] = parts[2];
|
444
|
+
parts[5] = parts[3];
|
445
|
+
parts[2] = parts[0];
|
446
|
+
parts[6] = parts[4];
|
447
|
+
parts[7] = parts[1];
|
448
|
+
}
|
449
|
+
else if (flag == 'fromcircle') {
|
450
|
+
// @ url http://www.pixelwit.com/blog/2007/06/29/basic-circle-drawing-actionscript/
|
451
|
+
var centerX = parseInt(parts[0], 10);
|
452
|
+
var centerY = parseInt(parts[1], 10);
|
453
|
+
var radius = parseInt(parts[2], 10);
|
454
|
+
var j = 0;
|
455
|
+
parts[j++] = centerX + radius;
|
456
|
+
parts[j++] = centerY;
|
457
|
+
var sides = 60; //constant = sides the fake circle will have
|
458
|
+
for (i = 0; i <= sides; i++) {
|
459
|
+
var pointRatio = i / sides;
|
460
|
+
var xSteps = Math.cos(pointRatio * 2 * Math.PI);
|
461
|
+
var ySteps = Math.sin(pointRatio * 2 * Math.PI);
|
462
|
+
var pointX = centerX + xSteps * radius;
|
463
|
+
var pointY = centerY + ySteps * radius;
|
464
|
+
parts[j++] = Math.round(pointX);
|
465
|
+
parts[j++] = Math.round(pointY);
|
466
|
+
}
|
467
|
+
}
|
468
|
+
coords = parts.join(',');
|
469
|
+
}
|
470
|
+
if (flag == 'preserve' && oldcoords != coords) {
|
471
|
+
//return original and throw error
|
472
|
+
//throw "invalid coords";
|
473
|
+
return oldcoords;
|
474
|
+
}
|
475
|
+
return coords;
|
476
|
+
};
|
477
|
+
/**
|
478
|
+
* Sets the coordinates according to the given JSON map code or DOM object.
|
479
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
480
|
+
* @date 2006-06-07 11:47:16
|
481
|
+
* @param map DOM object or string of a map you want to apply.
|
482
|
+
* @return True on success
|
483
|
+
*/
|
484
|
+
this.setMapJson = function (map) {
|
485
|
+
this.fireEvent('onSetMap', map);
|
486
|
+
//remove all areas
|
487
|
+
this.removeAllAreas();
|
488
|
+
this.mapname = map.name;
|
489
|
+
this.mapid = map.id;
|
490
|
+
var shape, coords, href, alt, title, target, id;
|
491
|
+
for (var i = 0, le = map.areas.length; i < le; i++) {
|
492
|
+
shape = coords = href = alt = title = target = '';
|
493
|
+
id = this.addNewArea(); //btw id == this.currentid, just this form is a bit clearer
|
494
|
+
shape = this._normShape(map.areas[i].shape);
|
495
|
+
this.initArea(id, shape);
|
496
|
+
if (map.areas[i].coords) {
|
497
|
+
//normalize coords
|
498
|
+
coords = this._normCoords(map.areas[i].coords, shape);
|
499
|
+
this.areas[id].lastInput = coords;
|
500
|
+
//for area this one will be set in recalculate
|
501
|
+
}
|
502
|
+
href = map.areas[i].href;
|
503
|
+
if (href) {
|
504
|
+
this.areas[id].ahref = href;
|
505
|
+
}
|
506
|
+
alt = map.areas[i].alt;
|
507
|
+
if (alt) {
|
508
|
+
this.areas[id].aalt = alt;
|
509
|
+
}
|
510
|
+
target = map.areas[i].target;
|
511
|
+
if (target) {
|
512
|
+
target = target.toLowerCase();
|
513
|
+
}
|
514
|
+
this.areas[id].atarget = target;
|
515
|
+
this._recalculate(id, coords); //contains repaint
|
516
|
+
this.relaxArea(id);
|
517
|
+
this.fireEvent('onAreaChanged', this.areas[id]);
|
518
|
+
} //end for areas
|
519
|
+
};
|
520
|
+
/**
|
521
|
+
* Adds a new area. It will later become a canvas.
|
522
|
+
* GUI should use the onAddArea callback to act accordingly.
|
523
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
524
|
+
* @date 2006-06-06 16:49:25
|
525
|
+
* @see #initArea
|
526
|
+
*/
|
527
|
+
this.addNewArea = function () {
|
528
|
+
var lastarea = this._getLastArea();
|
529
|
+
var id = (lastarea) ? lastarea.aid + 1 : 0;
|
530
|
+
//insert new possibly? unknown area (will be initialized at mousedown)
|
531
|
+
var area = this.areas[id] = document.createElement('DIV');
|
532
|
+
area.id = this.mapname + 'area' + id;
|
533
|
+
area.aid = id;
|
534
|
+
area.shape = "undefined";
|
535
|
+
this.blurArea(this.currentid);
|
536
|
+
this.currentid = id;
|
537
|
+
return id;
|
538
|
+
};
|
539
|
+
/**
|
540
|
+
* Initialize a new area.
|
541
|
+
* Create the canvas, initialize it.
|
542
|
+
* Reset area parameters.
|
543
|
+
* @param id The id of the area (already existing with undefined shape)
|
544
|
+
* @param shape The shape the area will have (rect, circle, poly)
|
545
|
+
*/
|
546
|
+
this.initArea = function (id, shape) {
|
547
|
+
var area = this.areas[id];
|
548
|
+
if (!area) {
|
549
|
+
return;
|
550
|
+
} //if all was erased, return
|
551
|
+
//remove preinited dummy div or already placed canvas
|
552
|
+
if (area.parentNode) {
|
553
|
+
area.parentNode.removeChild(area);
|
554
|
+
}
|
555
|
+
if (area.label) {
|
556
|
+
area.label.parentNode.removeChild(area.label);
|
557
|
+
}
|
558
|
+
//create CANVAS node
|
559
|
+
area = this.areas[id] = document.createElement('CANVAS');
|
560
|
+
this.parentImageElement.appendChild(area);
|
561
|
+
this.parentImageElement.style.position = 'relative';
|
562
|
+
// if (typeof G_vmlCanvasManager != "undefined") {
|
563
|
+
// //override CANVAS with VML object
|
564
|
+
// area = this.areas[id] = G_vmlCanvasManager.initElement(area);
|
565
|
+
// }
|
566
|
+
area.id = this.mapname + 'area' + id;
|
567
|
+
area.aid = id;
|
568
|
+
area.shape = shape;
|
569
|
+
area.ahref = '';
|
570
|
+
area.atitle = '';
|
571
|
+
area.aalt = '';
|
572
|
+
area.atarget = '';
|
573
|
+
area.style.position = 'absolute';
|
574
|
+
area.style.top = this.imageElement.offsetTop + 'px';
|
575
|
+
area.style.left = this.imageElement.offsetLeft + 'px';
|
576
|
+
this._setopacity(area, this.config.CL_DRAW_BG, this.config.draw_opacity);
|
577
|
+
//hook event handlers
|
578
|
+
area.onmousedown = this.area_mousedown.bind(this);
|
579
|
+
area.onmouseup = this.area_mouseup.bind(this);
|
580
|
+
area.onmousemove = this.area_mousemove.bind(this);
|
581
|
+
area.onmouseover = this.area_mouseover.bind(this);
|
582
|
+
area.onmouseout = this.area_mouseout.bind(this);
|
583
|
+
//initialize memory object
|
584
|
+
this.memory[id] = {};
|
585
|
+
this.memory[id].downx = 0;
|
586
|
+
this.memory[id].downy = 0;
|
587
|
+
this.memory[id].left = 0;
|
588
|
+
this.memory[id].top = 0;
|
589
|
+
this.memory[id].width = 0;
|
590
|
+
this.memory[id].height = 0;
|
591
|
+
this.memory[id].xpoints = [];
|
592
|
+
this.memory[id].ypoints = [];
|
593
|
+
//create label node
|
594
|
+
area.label = document.createElement('DIV');
|
595
|
+
this.parentImageElement.appendChild(area.label);
|
596
|
+
area.label.className = this.config.label_class;
|
597
|
+
this.assignCSS(area.label, this.config.label_style);
|
598
|
+
area.label.style.position = 'absolute';
|
599
|
+
this.fireEvent('onAddArea', id);
|
600
|
+
};
|
601
|
+
/**
|
602
|
+
* Resets area border and opacity to a normal state after drawing.
|
603
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
604
|
+
* @date 15-02-2007 22:07:28
|
605
|
+
* @param id The id of the area.
|
606
|
+
|
607
|
+
*/
|
608
|
+
this.relaxArea = function (id) {
|
609
|
+
var area = this.areas[id];
|
610
|
+
if (!area) {
|
611
|
+
return;
|
612
|
+
}
|
613
|
+
if (id != this.currentid) {
|
614
|
+
this._setBorder(area, 'NORM');
|
615
|
+
this._setopacity(area, this.config.CL_NORM_BG, this.config.norm_opacity);
|
616
|
+
}
|
617
|
+
else
|
618
|
+
this.highlightArea(id);
|
619
|
+
};
|
620
|
+
/**
|
621
|
+
* Set border of a given area according to style flag.
|
622
|
+
* Possible values of style: NORM, HIGHLIGHT, DRAW.
|
623
|
+
* Non-rectangle shapes wont get a border if config.bounding_box is false.
|
624
|
+
* @date 26-12-2008 22:34:41
|
625
|
+
* @param id The id of the area to set the border on.
|
626
|
+
* @param style Coloring style (NORM, HIGHLIGHT, DRAW), see relevant colors in config.
|
627
|
+
* @since 2.1
|
628
|
+
*/
|
629
|
+
this._setBorder = function (area, style) {
|
630
|
+
if (area.shape == 'rect' || this.config.bounding_box) {
|
631
|
+
area.style.borderWidth = '1px';
|
632
|
+
area.style.borderStyle = (style == 'DRAW' ? 'dotted' : 'solid');
|
633
|
+
area.style.borderColor = this.config['CL_' + style + '_' + (area.shape == 'rect' ? 'SHAPE' : 'BOX')];
|
634
|
+
}
|
635
|
+
else {
|
636
|
+
//clear border
|
637
|
+
area.style.border = '';
|
638
|
+
}
|
639
|
+
};
|
640
|
+
/**
|
641
|
+
* Set opacity of area to the given percentage, as well as set the background color.
|
642
|
+
* If percentage contains a dash(-), the setting of the opacity will be gradual.
|
643
|
+
* @param area The area object.
|
644
|
+
* @param bgcolor New background color
|
645
|
+
* @param pct Percentage of the opacity.
|
646
|
+
*/
|
647
|
+
this._setopacity = function (area, bgcolor, pct) {
|
648
|
+
if (bgcolor) {
|
649
|
+
area.style.backgroundColor = bgcolor;
|
650
|
+
}
|
651
|
+
if (pct && typeof pct == 'string' && pct.match(/^\d*\-\d+$/)) {
|
652
|
+
//gradual fade
|
653
|
+
var parts = pct.split('-');
|
654
|
+
if (typeof parts[0] != 'undefined') {
|
655
|
+
//set initial opacity
|
656
|
+
parts[0] = parseInt(parts[0], 10);
|
657
|
+
this._setopacity(area, bgcolor, parts[0]);
|
658
|
+
}
|
659
|
+
if (typeof parts[1] != 'undefined') {
|
660
|
+
parts[1] = parseInt(parts[1], 10);
|
661
|
+
var curr = this._getopacity(area);
|
662
|
+
var _this = this;
|
663
|
+
var diff = Math.round(parts[1] - curr);
|
664
|
+
if (diff > 5) {
|
665
|
+
window.setTimeout(function () { _this._setopacity(area, null, '-' + parts[1]); }, 20);
|
666
|
+
pct = 1 * curr + 5;
|
667
|
+
}
|
668
|
+
else if (diff < -3) {
|
669
|
+
window.setTimeout(function () { _this._setopacity(area, null, '-' + parts[1]); }, 20);
|
670
|
+
pct = 1 * curr - 3;
|
671
|
+
}
|
672
|
+
else {
|
673
|
+
//final set
|
674
|
+
pct = parts[1];
|
675
|
+
}
|
676
|
+
}
|
677
|
+
}
|
678
|
+
if (!isNaN(pct)) {
|
679
|
+
pct = Math.round(parseInt(pct, 10));
|
680
|
+
area.style.opacity = pct / 100;
|
681
|
+
area.style.filter = 'alpha(opacity=' + pct + ')';
|
682
|
+
}
|
683
|
+
};
|
684
|
+
/**
|
685
|
+
* Get the currently set opacity of a given area.
|
686
|
+
* @author adam
|
687
|
+
* @param area The area (canvas) you want to get opacity info from.
|
688
|
+
* @return Opacity value in a range of 0-100.
|
689
|
+
*/
|
690
|
+
this._getopacity = function (area) {
|
691
|
+
if (area.style.opacity <= 1) {
|
692
|
+
return area.style.opacity * 100;
|
693
|
+
}
|
694
|
+
if (area.style.filter) {
|
695
|
+
//alpha(opacity=NaN)
|
696
|
+
return parseInt(area.style.filter.replace(/alpha\(opacity\=([^\)]*)\)/ig, "$1"), 10);
|
697
|
+
}
|
698
|
+
return 100; //default opacity
|
699
|
+
};
|
700
|
+
/**
|
701
|
+
* Removes the area marked by id.
|
702
|
+
* Callback will call the GUI code to remove GUI elements.
|
703
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
704
|
+
* @date 11-02-2007 20:40:58
|
705
|
+
* @param id The id of the area to remove.
|
706
|
+
* @see #removeAllAreas
|
707
|
+
*/
|
708
|
+
this.removeArea = function (id) {
|
709
|
+
if (id === null || typeof id == "undefined") {
|
710
|
+
return;
|
711
|
+
} //exit if no id given
|
712
|
+
try {
|
713
|
+
//remove area and label
|
714
|
+
//explicitly set some values to null to avoid IE circular reference memleak
|
715
|
+
this.areas[id].label.parentNode.removeChild(this.areas[id].label);
|
716
|
+
this.areas[id].parentNode.removeChild(this.areas[id]);
|
717
|
+
this.areas[id].label.className = null;
|
718
|
+
this.areas[id].label = null;
|
719
|
+
this.areas[id].onmouseover = null;
|
720
|
+
this.areas[id].onmouseout = null;
|
721
|
+
this.areas[id].onmouseup = null;
|
722
|
+
this.areas[id].onmousedown = null;
|
723
|
+
this.areas[id].onmousemove = null;
|
724
|
+
}
|
725
|
+
catch (err) {
|
726
|
+
}
|
727
|
+
this.areas[id] = null;
|
728
|
+
this.fireEvent('onRemoveArea', id);
|
729
|
+
};
|
730
|
+
/**
|
731
|
+
* Removes all areas.
|
732
|
+
* Will call removeArea on all areas.
|
733
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
734
|
+
* @date 2006-06-07 11:55:34
|
735
|
+
* @see #removeArea
|
736
|
+
*/
|
737
|
+
this.removeAllAreas = function () {
|
738
|
+
for (var i = 0, le = this.areas.length; i < le; i++) {
|
739
|
+
if (this.areas[i]) {
|
740
|
+
this.removeArea(i);
|
741
|
+
}
|
742
|
+
}
|
743
|
+
};
|
744
|
+
/**
|
745
|
+
* Scales all areas.
|
746
|
+
* Will store scale parameter in globalscale property.
|
747
|
+
* This is needed to know how to draw new areas on an already scaled canvas.
|
748
|
+
* @author adam
|
749
|
+
* @date 02-11-2008 14:13:14
|
750
|
+
* @param scale Scale factor (1-original, 0.5-half, 2-double, etc.)
|
751
|
+
*/
|
752
|
+
this.scaleAllAreas = function (scale) {
|
753
|
+
var rscale = scale / this.globalscale; //relative scale
|
754
|
+
this.globalscale = scale;
|
755
|
+
for (var i = 0, le = this.areas.length; i < le; i++) {
|
756
|
+
if (this.areas[i] && this.areas[i].shape != 'undefined') {
|
757
|
+
this.scaleArea(i, rscale);
|
758
|
+
}
|
759
|
+
}
|
760
|
+
};
|
761
|
+
/**
|
762
|
+
* Scales one area.
|
763
|
+
* @author adam
|
764
|
+
* @date 02-11-2008 14:13:14
|
765
|
+
* @param rscale Relative scale factor (1-keep, 0.5-half, 2-double, etc.)
|
766
|
+
*/
|
767
|
+
this.scaleArea = function (id, rscale) {
|
768
|
+
var area = this.areas[id];
|
769
|
+
//set position and new dimensions
|
770
|
+
area.style.top = parseInt(area.style.top, 10) * rscale + 'px';
|
771
|
+
area.style.left = parseInt(area.style.left, 10) * rscale + 'px';
|
772
|
+
this.setAreaSize(id, area.width * rscale, area.height * rscale);
|
773
|
+
//handle polygon coordinates scaling
|
774
|
+
if (area.shape == 'poly') {
|
775
|
+
for (var i = 0, le = area.xpoints.length; i < le; i++) {
|
776
|
+
area.xpoints[i] *= rscale;
|
777
|
+
area.ypoints[i] *= rscale;
|
778
|
+
}
|
779
|
+
}
|
780
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
781
|
+
this._updatecoords(id);
|
782
|
+
};
|
783
|
+
/**
|
784
|
+
* Put label in the top left corner according to label config.
|
785
|
+
* By default it will contain the number of the area (area.aid)
|
786
|
+
* @param id The id of the area to add label to.
|
787
|
+
*/
|
788
|
+
this._putlabel = function (id) {
|
789
|
+
var area = this.areas[id];
|
790
|
+
if (!area.label) {
|
791
|
+
return;
|
792
|
+
} //not yet inited
|
793
|
+
try {
|
794
|
+
if (!this.config.label) {
|
795
|
+
area.label.innerHTML = '';
|
796
|
+
area.label.style.display = 'none';
|
797
|
+
}
|
798
|
+
else {
|
799
|
+
area.label.style.display = '';
|
800
|
+
var label = this.config.label;
|
801
|
+
label = label.replace(/%n/g, String(id));
|
802
|
+
label = label.replace(/%c/g, String(area.lastInput));
|
803
|
+
label = label.replace(/%h/g, String(area.ahref));
|
804
|
+
label = label.replace(/%a/g, String(area.aalt));
|
805
|
+
label = label.replace(/%t/g, String(area.atitle));
|
806
|
+
area.label.innerHTML = label;
|
807
|
+
}
|
808
|
+
//align to the top left corner
|
809
|
+
area.label.style.top = area.style.top;
|
810
|
+
area.label.style.left = area.style.left;
|
811
|
+
}
|
812
|
+
catch (err) {
|
813
|
+
this.log("Error putting label", 1);
|
814
|
+
}
|
815
|
+
};
|
816
|
+
/**
|
817
|
+
* Set area title and alt (for IE) according to the hint configuration.
|
818
|
+
* This will show up in the usual yellow box when you hover over with the mouse.
|
819
|
+
* @param id The id of the area to set hint at.
|
820
|
+
*/
|
821
|
+
this._puthint = function (id) {
|
822
|
+
try {
|
823
|
+
if (!this.config.hint) {
|
824
|
+
this.areas[id].title = '';
|
825
|
+
this.areas[id].alt = '';
|
826
|
+
}
|
827
|
+
else {
|
828
|
+
var hint = this.config.hint;
|
829
|
+
hint = hint.replace(/%n/g, String(id));
|
830
|
+
hint = hint.replace(/%c/g, String(this.areas[id].lastInput));
|
831
|
+
hint = hint.replace(/%h/g, String(this.areas[id].ahref));
|
832
|
+
hint = hint.replace(/%a/g, String(this.areas[id].aalt));
|
833
|
+
hint = hint.replace(/%t/g, String(this.areas[id].atitle));
|
834
|
+
this.areas[id].title = hint;
|
835
|
+
this.areas[id].alt = hint;
|
836
|
+
}
|
837
|
+
}
|
838
|
+
catch (err) {
|
839
|
+
this.log("Error putting hint", 1);
|
840
|
+
}
|
841
|
+
};
|
842
|
+
/**
|
843
|
+
* Will call repaint on all areas.
|
844
|
+
* Useful when you change labeling or hint config on the GUI.
|
845
|
+
* @see #_repaint
|
846
|
+
*/
|
847
|
+
this._repaintAll = function () {
|
848
|
+
for (var i = 0, le = this.areas.length; i < le; i++) {
|
849
|
+
if (this.areas[i]) {
|
850
|
+
this._repaint(this.areas[i], this.config.CL_NORM_SHAPE);
|
851
|
+
}
|
852
|
+
}
|
853
|
+
};
|
854
|
+
/**
|
855
|
+
* Repaints the actual canvas content.
|
856
|
+
* This is the only canvas drawing magic that is happening.
|
857
|
+
* In fact rectangles will not have any canvas content, just a normal css border.
|
858
|
+
* After repainting the canvas, it will call putlabel and puthint methods.
|
859
|
+
* @param area The area object.
|
860
|
+
* @param color Color of the line to draw on the canvas.
|
861
|
+
* @param x Only used for polygons as the newest control point x.
|
862
|
+
* @param y Only used for polygons as the newest control point y.
|
863
|
+
*/
|
864
|
+
this._repaint = function (area, color, x, y) {
|
865
|
+
var ctx; //canvas context
|
866
|
+
var width, height, left, top; //canvas properties
|
867
|
+
var i, le; //loop counter
|
868
|
+
if (area.shape == 'circle') {
|
869
|
+
width = parseInt(area.style.width, 10);
|
870
|
+
var radius = Math.floor(width / 2) - 1;
|
871
|
+
if (radius < 0)
|
872
|
+
radius = 0;
|
873
|
+
//get canvas context
|
874
|
+
ctx = area.getContext("2d");
|
875
|
+
//clear canvas
|
876
|
+
ctx.clearRect(0, 0, width, width);
|
877
|
+
//draw circle
|
878
|
+
ctx.beginPath();
|
879
|
+
ctx.strokeStyle = color;
|
880
|
+
ctx.arc(radius, radius, radius, 0, Math.PI * 2, 0);
|
881
|
+
ctx.stroke();
|
882
|
+
ctx.closePath();
|
883
|
+
//draw center
|
884
|
+
ctx.strokeStyle = this.config.CL_KNOB;
|
885
|
+
ctx.strokeRect(radius, radius, 1, 1);
|
886
|
+
//put label
|
887
|
+
this._putlabel(area.aid);
|
888
|
+
this._puthint(area.aid);
|
889
|
+
}
|
890
|
+
else if (area.shape == 'rect') {
|
891
|
+
//put label
|
892
|
+
this._putlabel(area.aid);
|
893
|
+
this._puthint(area.aid);
|
894
|
+
}
|
895
|
+
else if (area.shape == 'poly') {
|
896
|
+
width = parseInt(area.style.width, 10);
|
897
|
+
height = parseInt(area.style.height, 10);
|
898
|
+
left = parseInt(area.style.left, 10);
|
899
|
+
top = parseInt(area.style.top, 10);
|
900
|
+
if (area.xpoints) {
|
901
|
+
//get canvas context
|
902
|
+
ctx = area.getContext("2d");
|
903
|
+
//clear canvas
|
904
|
+
ctx.clearRect(0, 0, width, height);
|
905
|
+
//draw polygon
|
906
|
+
ctx.beginPath();
|
907
|
+
ctx.strokeStyle = color;
|
908
|
+
ctx.moveTo(area.xpoints[0] - left, area.ypoints[0] - top);
|
909
|
+
for (i = 1, le = area.xpoints.length; i < le; i++) {
|
910
|
+
ctx.lineTo(area.xpoints[i] - left, area.ypoints[i] - top);
|
911
|
+
}
|
912
|
+
if (this.is_drawing == this.DM_POLYGON_DRAW || this.is_drawing == this.DM_POLYGON_LASTDRAW) {
|
913
|
+
//only draw to the current position if not moving
|
914
|
+
ctx.lineTo(x - left, y - top);
|
915
|
+
}
|
916
|
+
ctx.lineTo(area.xpoints[0] - left, area.ypoints[0] - top);
|
917
|
+
ctx.stroke();
|
918
|
+
ctx.closePath();
|
919
|
+
}
|
920
|
+
//put label
|
921
|
+
this._putlabel(area.aid);
|
922
|
+
this._puthint(area.aid);
|
923
|
+
}
|
924
|
+
};
|
925
|
+
/**
|
926
|
+
* Updates Area coordinates.
|
927
|
+
* Called when needed, eg. on mousemove, mousedown.
|
928
|
+
* Also updates html container value (thru hook).
|
929
|
+
* Calls callback onAreaChanged so that GUI can follow.
|
930
|
+
* This is an important hook to your GUI.
|
931
|
+
* Uses globalscale to scale real coordinates to area coordinates.
|
932
|
+
* @date 2006.10.24. 22:39:27
|
933
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
934
|
+
* @param id The id of the area.
|
935
|
+
*/
|
936
|
+
this._updatecoords = function (id) {
|
937
|
+
var area = this.areas[id];
|
938
|
+
var left = Math.round(parseInt(area.style.left, 10) / this.globalscale);
|
939
|
+
var top = Math.round(parseInt(area.style.top, 10) / this.globalscale);
|
940
|
+
var height = Math.round(parseInt(area.style.height, 10) / this.globalscale);
|
941
|
+
var width = Math.round(parseInt(area.style.width, 10) / this.globalscale);
|
942
|
+
var value = '';
|
943
|
+
if (area.shape == 'rect') {
|
944
|
+
value = left + ',' + top + ',' + (left + width) + ',' + (top + height);
|
945
|
+
area.lastInput = value;
|
946
|
+
}
|
947
|
+
else if (area.shape == 'circle') {
|
948
|
+
var radius = Math.floor(width / 2) - 1;
|
949
|
+
value = (left + radius) + ',' + (top + radius) + ',' + radius;
|
950
|
+
area.lastInput = value;
|
951
|
+
}
|
952
|
+
else if (area.shape == 'poly') {
|
953
|
+
if (area.xpoints) {
|
954
|
+
for (var i = 0, le = area.xpoints.length; i < le; i++) {
|
955
|
+
value += Math.round(area.xpoints[i] / this.globalscale) + ',' +
|
956
|
+
Math.round(area.ypoints[i] / this.globalscale) + ',';
|
957
|
+
}
|
958
|
+
value = value.substring(0, value.length - 1);
|
959
|
+
}
|
960
|
+
area.lastInput = value;
|
961
|
+
}
|
962
|
+
this.fireEvent('onAreaChanged', area);
|
963
|
+
};
|
964
|
+
/**
|
965
|
+
* Updates the visual representation of the area with the given id according
|
966
|
+
* to the new coordinates that typically come from an input on the GUI.
|
967
|
+
* Uses globalscale to scale area coordinates to real coordinates.
|
968
|
+
* @date 2006.10.24. 22:46:55
|
969
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
970
|
+
* @param id The id of the area.
|
971
|
+
* @param coords The new coords, they will be normalized.
|
972
|
+
*/
|
973
|
+
this._recalculate = function (id, coords) {
|
974
|
+
var area = this.areas[id];
|
975
|
+
try {
|
976
|
+
if (coords) {
|
977
|
+
coords = this._normCoords(coords, area.shape, 'preserve');
|
978
|
+
}
|
979
|
+
else {
|
980
|
+
coords = area.lastInput || '';
|
981
|
+
}
|
982
|
+
var parts = coords.split(',');
|
983
|
+
if (area.shape == 'rect') {
|
984
|
+
if (parts.length != 4 ||
|
985
|
+
parseInt(parts[0], 10) > parseInt(parts[2], 10) ||
|
986
|
+
parseInt(parts[1], 10) > parseInt(parts[3], 10)) {
|
987
|
+
throw "invalid coords";
|
988
|
+
}
|
989
|
+
area.style.left = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[0], 10)) + 'px';
|
990
|
+
area.style.top = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[1], 10)) + 'px';
|
991
|
+
this.setAreaSize(id, this.globalscale * (parts[2] - parts[0]), this.globalscale * (parts[3] - parts[1]));
|
992
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
993
|
+
}
|
994
|
+
else if (area.shape == 'circle') {
|
995
|
+
if (parts.length != 3 ||
|
996
|
+
parseInt(parts[2], 10) < 0) {
|
997
|
+
throw "invalid coords";
|
998
|
+
}
|
999
|
+
var width = 2 * (parts[2]);
|
1000
|
+
this.setAreaSize(id, this.globalscale * width, this.globalscale * width);
|
1001
|
+
area.style.left = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[0], 10) - width / 2) + 'px';
|
1002
|
+
area.style.top = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[1], 10) - width / 2) + 'px';
|
1003
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
1004
|
+
}
|
1005
|
+
else if (area.shape == 'poly') {
|
1006
|
+
if (parts.length < 2) {
|
1007
|
+
throw "invalid coords";
|
1008
|
+
}
|
1009
|
+
area.xpoints = [];
|
1010
|
+
area.ypoints = [];
|
1011
|
+
for (var i = 0, le = parts.length; i < le; i += 2) {
|
1012
|
+
area.xpoints[area.xpoints.length] = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[i], 10));
|
1013
|
+
area.ypoints[area.ypoints.length] = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[i + 1], 10));
|
1014
|
+
this._polygongrow(area, this.globalscale * parts[i], this.globalscale * parts[i + 1]);
|
1015
|
+
}
|
1016
|
+
this._polygonshrink(area); //includes repaint
|
1017
|
+
}
|
1018
|
+
}
|
1019
|
+
catch (err) {
|
1020
|
+
var msg = (err.message) ? err.message : 'error calculating coordinates';
|
1021
|
+
this.log(msg, 1);
|
1022
|
+
this.statusMessage(this.strings.ERR_INVALID_COORDS);
|
1023
|
+
if (area.lastInput) {
|
1024
|
+
this.fireEvent('onAreaChanged', area);
|
1025
|
+
}
|
1026
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
1027
|
+
return;
|
1028
|
+
}
|
1029
|
+
//on success update lastInput
|
1030
|
+
area.lastInput = coords;
|
1031
|
+
};
|
1032
|
+
/**
|
1033
|
+
* Grow polygon area to be able to contain the given new coordinates.
|
1034
|
+
* @author adam
|
1035
|
+
* @param area The area to grow.
|
1036
|
+
* @param newx The new coordinate x.
|
1037
|
+
* @param newy The new coordinate y.
|
1038
|
+
* @see #_polygonshrink
|
1039
|
+
*/
|
1040
|
+
this._polygongrow = function (area, newx, newy) {
|
1041
|
+
var xdiff = newx - parseInt(area.style.left, 10);
|
1042
|
+
var ydiff = newy - parseInt(area.style.top, 10);
|
1043
|
+
var pad = 0; //padding on the edges
|
1044
|
+
var pad2 = 0; //twice the padding
|
1045
|
+
if (newx < parseInt(area.style.left, 10)) {
|
1046
|
+
area.style.left = (newx - pad) + 'px';
|
1047
|
+
this.setAreaSize(area.aid, parseInt(area.style.width, 10) + Math.abs(xdiff) + pad2, null);
|
1048
|
+
}
|
1049
|
+
else if (newx > parseInt(area.style.left, 10) + parseInt(area.style.width, 10)) {
|
1050
|
+
this.setAreaSize(area.aid, newx - parseInt(area.style.left, 10) + pad2, null);
|
1051
|
+
}
|
1052
|
+
if (newy < parseInt(area.style.top, 10)) {
|
1053
|
+
area.style.top = (newy - pad) + 'px';
|
1054
|
+
this.setAreaSize(area.aid, null, parseInt(area.style.height, 10) + Math.abs(ydiff) + pad2);
|
1055
|
+
}
|
1056
|
+
else if (newy > parseInt(area.style.top, 10) + parseInt(area.style.height, 10)) {
|
1057
|
+
this.setAreaSize(area.aid, null, newy - parseInt(area.style.top, 10) + pad2);
|
1058
|
+
}
|
1059
|
+
};
|
1060
|
+
/**
|
1061
|
+
* Shrink the polygon bounding area to the necessary size, by first reducing it
|
1062
|
+
* to the minimum, and then gradually growing it.
|
1063
|
+
* We need this because while we were drawing the polygon, it might have expanded
|
1064
|
+
* the canvas more than needed.
|
1065
|
+
* Will repaint the area.
|
1066
|
+
* @author adam
|
1067
|
+
* @param area The area to shrink.
|
1068
|
+
* @see #_polygongrow
|
1069
|
+
*/
|
1070
|
+
this._polygonshrink = function (area) {
|
1071
|
+
area.style.left = (area.xpoints[0]) + 'px';
|
1072
|
+
area.style.top = (area.ypoints[0]) + 'px';
|
1073
|
+
this.setAreaSize(area.aid, 0, 0);
|
1074
|
+
for (var i = 0, le = area.xpoints.length; i < le; i++) {
|
1075
|
+
this._polygongrow(area, area.xpoints[i], area.ypoints[i]);
|
1076
|
+
}
|
1077
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
1078
|
+
};
|
1079
|
+
/**
|
1080
|
+
* EVENT HANDLER: Handles mousemove on the image.
|
1081
|
+
* This is the main drawing routine.
|
1082
|
+
* Depending on the current shape, will draw the rect/circle/poly to the new position.
|
1083
|
+
* @param e The event object.
|
1084
|
+
*/
|
1085
|
+
this.img_mousemove = function (e) {
|
1086
|
+
//function level var declarations
|
1087
|
+
var xdiff, ydiff, diff;
|
1088
|
+
//event.x is relative to parent element, but page.x is NOT
|
1089
|
+
//pos coordinates are the same absolute coords, offset coords are relative to parent
|
1090
|
+
const windowEvent = window.event;
|
1091
|
+
var pos = this._getPos(this.imageElement), x = (this.isMSIE) ? (windowEvent.x + this.parentImageElement.scrollLeft - this.imageElement.offsetLeft) : (e.clientX - pos.x), y = (this.isMSIE) ? (windowEvent.y + this.parentImageElement.scrollTop - this.imageElement.offsetTop) : (e.clientY - pos.y);
|
1092
|
+
x = Math.round(x);
|
1093
|
+
y = Math.round(y);
|
1094
|
+
//exit if outside image
|
1095
|
+
if (x < 0 || y < 0 || x > this.imageElement.width || y > this.imageElement.height) {
|
1096
|
+
return;
|
1097
|
+
}
|
1098
|
+
//old dimensions that need to be updated in this function
|
1099
|
+
if (this.memory[this.currentid]) {
|
1100
|
+
var top = this.memory[this.currentid].top;
|
1101
|
+
var left = this.memory[this.currentid].left;
|
1102
|
+
var height = this.memory[this.currentid].height;
|
1103
|
+
var width = this.memory[this.currentid].width;
|
1104
|
+
}
|
1105
|
+
var area = this.areas[this.currentid];
|
1106
|
+
// Handle shift state for Safari
|
1107
|
+
// Safari doesn't generate keyboard events for modifiers: http://bugs.webkit.org/show_bug.cgi?id=11696
|
1108
|
+
if (this.isSafari) {
|
1109
|
+
if (e.shiftKey) {
|
1110
|
+
if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
|
1111
|
+
this.is_drawing = this.DM_SQUARE_DRAW;
|
1112
|
+
this.statusMessage(this.strings.SQUARE_DRAW);
|
1113
|
+
}
|
1114
|
+
}
|
1115
|
+
else {
|
1116
|
+
if (this.is_drawing == this.DM_SQUARE_DRAW && area.shape == 'rect') {
|
1117
|
+
//not for circle!
|
1118
|
+
this.is_drawing = this.DM_RECTANGLE_DRAW;
|
1119
|
+
this.statusMessage(this.strings.RECTANGLE_DRAW);
|
1120
|
+
}
|
1121
|
+
}
|
1122
|
+
}
|
1123
|
+
if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
|
1124
|
+
//rectangle mode
|
1125
|
+
this.fireEvent('onDrawArea', this.currentid);
|
1126
|
+
xdiff = x - this.memory[this.currentid].downx;
|
1127
|
+
ydiff = y - this.memory[this.currentid].downy;
|
1128
|
+
this.setAreaSize(this.currentid, Math.abs(xdiff), Math.abs(ydiff));
|
1129
|
+
if (xdiff < 0) {
|
1130
|
+
area.style.left = (x + 1) + 'px';
|
1131
|
+
}
|
1132
|
+
if (ydiff < 0) {
|
1133
|
+
area.style.top = (y + 1) + 'px';
|
1134
|
+
}
|
1135
|
+
}
|
1136
|
+
else if (this.is_drawing == this.DM_SQUARE_DRAW) {
|
1137
|
+
//square mode - align to shorter side
|
1138
|
+
this.fireEvent('onDrawArea', this.currentid);
|
1139
|
+
xdiff = x - this.memory[this.currentid].downx;
|
1140
|
+
ydiff = y - this.memory[this.currentid].downy;
|
1141
|
+
if (Math.abs(xdiff) < Math.abs(ydiff)) {
|
1142
|
+
diff = Math.abs(parseInt(xdiff, 10));
|
1143
|
+
}
|
1144
|
+
else {
|
1145
|
+
diff = Math.abs(parseInt(ydiff, 10));
|
1146
|
+
}
|
1147
|
+
this.setAreaSize(this.currentid, diff, diff);
|
1148
|
+
if (xdiff < 0) {
|
1149
|
+
area.style.left = (this.memory[this.currentid].downx + diff * -1) + 'px';
|
1150
|
+
}
|
1151
|
+
if (ydiff < 0) {
|
1152
|
+
area.style.top = (this.memory[this.currentid].downy + diff * -1 + 1) + 'px';
|
1153
|
+
}
|
1154
|
+
}
|
1155
|
+
else if (this.is_drawing == this.DM_POLYGON_DRAW) {
|
1156
|
+
//polygon mode
|
1157
|
+
this.fireEvent('onDrawArea', this.currentid);
|
1158
|
+
this._polygongrow(area, x, y);
|
1159
|
+
}
|
1160
|
+
else if (this.is_drawing == this.DM_RECTANGLE_MOVE || this.is_drawing == this.DM_SQUARE_MOVE) {
|
1161
|
+
this.fireEvent('onMoveArea', this.currentid);
|
1162
|
+
x = x - this.memory[this.currentid].rdownx;
|
1163
|
+
y = y - this.memory[this.currentid].rdowny;
|
1164
|
+
if (x + width > this.imageElement.width || y + height > this.imageElement.height) {
|
1165
|
+
return;
|
1166
|
+
}
|
1167
|
+
if (x < 0 || y < 0) {
|
1168
|
+
return;
|
1169
|
+
}
|
1170
|
+
area.style.left = x + 1 + 'px';
|
1171
|
+
area.style.top = y + 1 + 'px';
|
1172
|
+
}
|
1173
|
+
else if (this.is_drawing == this.DM_POLYGON_MOVE) {
|
1174
|
+
this.fireEvent('onMoveArea', this.currentid);
|
1175
|
+
x = x - this.memory[this.currentid].rdownx;
|
1176
|
+
y = y - this.memory[this.currentid].rdowny;
|
1177
|
+
if (x + width > this.imageElement.width || y + height > this.imageElement.height) {
|
1178
|
+
return;
|
1179
|
+
}
|
1180
|
+
if (x < 0 || y < 0) {
|
1181
|
+
return;
|
1182
|
+
}
|
1183
|
+
xdiff = x - left;
|
1184
|
+
ydiff = y - top;
|
1185
|
+
if (area.xpoints) {
|
1186
|
+
for (var i = 0, le = area.xpoints.length; i < le; i++) {
|
1187
|
+
area.xpoints[i] = this.memory[this.currentid].xpoints[i] + xdiff;
|
1188
|
+
area.ypoints[i] = this.memory[this.currentid].ypoints[i] + ydiff;
|
1189
|
+
}
|
1190
|
+
}
|
1191
|
+
area.style.left = x + 'px';
|
1192
|
+
area.style.top = y + 'px';
|
1193
|
+
}
|
1194
|
+
else if (this.is_drawing == this.DM_SQUARE_RESIZE_LEFT) {
|
1195
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1196
|
+
diff = x - left;
|
1197
|
+
if ((width + (-1 * diff)) > 0) {
|
1198
|
+
//real resize left
|
1199
|
+
area.style.left = x + 1 + 'px';
|
1200
|
+
area.style.top = (top + (diff / 2)) + 'px';
|
1201
|
+
this.setAreaSize(this.currentid, parseInt(width + (-1 * diff), 10), parseInt(height + (-1 * diff), 10));
|
1202
|
+
}
|
1203
|
+
else {
|
1204
|
+
//jump to another state
|
1205
|
+
this.memory[this.currentid].width = 0;
|
1206
|
+
this.memory[this.currentid].height = 0;
|
1207
|
+
this.memory[this.currentid].left = x;
|
1208
|
+
this.memory[this.currentid].top = y;
|
1209
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_RIGHT;
|
1210
|
+
}
|
1211
|
+
}
|
1212
|
+
else if (this.is_drawing == this.DM_SQUARE_RESIZE_RIGHT) {
|
1213
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1214
|
+
diff = x - left - width;
|
1215
|
+
if ((width + (diff)) - 1 > 0) {
|
1216
|
+
//real resize right
|
1217
|
+
area.style.top = (top + (-1 * diff / 2)) + 'px';
|
1218
|
+
this.setAreaSize(this.currentid, (width + (diff)) - 1, (height + (diff)));
|
1219
|
+
}
|
1220
|
+
else {
|
1221
|
+
//jump to another state
|
1222
|
+
this.memory[this.currentid].width = 0;
|
1223
|
+
this.memory[this.currentid].height = 0;
|
1224
|
+
this.memory[this.currentid].left = x;
|
1225
|
+
this.memory[this.currentid].top = y;
|
1226
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_LEFT;
|
1227
|
+
}
|
1228
|
+
}
|
1229
|
+
else if (this.is_drawing == this.DM_SQUARE_RESIZE_TOP) {
|
1230
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1231
|
+
diff = y - top;
|
1232
|
+
if ((width + (-1 * diff)) > 0) {
|
1233
|
+
//real resize top
|
1234
|
+
area.style.top = y + 1 + 'px';
|
1235
|
+
area.style.left = (left + (diff / 2)) + 'px';
|
1236
|
+
this.setAreaSize(this.currentid, (width + (-1 * diff)), (height + (-1 * diff)));
|
1237
|
+
}
|
1238
|
+
else {
|
1239
|
+
//jump to another state
|
1240
|
+
this.memory[this.currentid].width = 0;
|
1241
|
+
this.memory[this.currentid].height = 0;
|
1242
|
+
this.memory[this.currentid].left = x;
|
1243
|
+
this.memory[this.currentid].top = y;
|
1244
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_BOTTOM;
|
1245
|
+
}
|
1246
|
+
}
|
1247
|
+
else if (this.is_drawing == this.DM_SQUARE_RESIZE_BOTTOM) {
|
1248
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1249
|
+
diff = y - top - height;
|
1250
|
+
if ((width + (diff)) - 1 > 0) {
|
1251
|
+
//real resize bottom
|
1252
|
+
area.style.left = (left + (-1 * diff / 2)) + 'px';
|
1253
|
+
this.setAreaSize(this.currentid, (width + (diff)) - 1, (height + (diff)) - 1);
|
1254
|
+
}
|
1255
|
+
else {
|
1256
|
+
//jump to another state
|
1257
|
+
this.memory[this.currentid].width = 0;
|
1258
|
+
this.memory[this.currentid].height = 0;
|
1259
|
+
this.memory[this.currentid].left = x;
|
1260
|
+
this.memory[this.currentid].top = y;
|
1261
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_TOP;
|
1262
|
+
}
|
1263
|
+
}
|
1264
|
+
else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_LEFT) {
|
1265
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1266
|
+
xdiff = x - left;
|
1267
|
+
if (width + (-1 * xdiff) > 0) {
|
1268
|
+
//real resize left
|
1269
|
+
area.style.left = x + 1 + 'px';
|
1270
|
+
this.setAreaSize(this.currentid, width + (-1 * xdiff), null);
|
1271
|
+
}
|
1272
|
+
else {
|
1273
|
+
//jump to another state
|
1274
|
+
this.memory[this.currentid].width = 0;
|
1275
|
+
this.memory[this.currentid].left = x;
|
1276
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_RIGHT;
|
1277
|
+
}
|
1278
|
+
}
|
1279
|
+
else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_RIGHT) {
|
1280
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1281
|
+
xdiff = x - left - width;
|
1282
|
+
if ((width + (xdiff)) - 1 > 0) {
|
1283
|
+
//real resize right
|
1284
|
+
this.setAreaSize(this.currentid, (width + (xdiff)) - 1, null);
|
1285
|
+
}
|
1286
|
+
else {
|
1287
|
+
//jump to another state
|
1288
|
+
this.memory[this.currentid].width = 0;
|
1289
|
+
this.memory[this.currentid].left = x;
|
1290
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_LEFT;
|
1291
|
+
}
|
1292
|
+
}
|
1293
|
+
else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_TOP) {
|
1294
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1295
|
+
ydiff = y - top;
|
1296
|
+
if ((height + (-1 * ydiff)) > 0) {
|
1297
|
+
//real resize top
|
1298
|
+
area.style.top = y + 1 + 'px';
|
1299
|
+
this.setAreaSize(this.currentid, null, (height + (-1 * ydiff)));
|
1300
|
+
}
|
1301
|
+
else {
|
1302
|
+
//jump to another state
|
1303
|
+
this.memory[this.currentid].height = 0;
|
1304
|
+
this.memory[this.currentid].top = y;
|
1305
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_BOTTOM;
|
1306
|
+
}
|
1307
|
+
}
|
1308
|
+
else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_BOTTOM) {
|
1309
|
+
this.fireEvent('onResizeArea', this.currentid);
|
1310
|
+
ydiff = y - top - height;
|
1311
|
+
if ((height + (ydiff)) - 1 > 0) {
|
1312
|
+
//real resize bottom
|
1313
|
+
this.setAreaSize(this.currentid, null, (height + (ydiff)) - 1);
|
1314
|
+
}
|
1315
|
+
else {
|
1316
|
+
//jump to another state
|
1317
|
+
this.memory[this.currentid].height = 0;
|
1318
|
+
this.memory[this.currentid].top = y;
|
1319
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_TOP;
|
1320
|
+
}
|
1321
|
+
}
|
1322
|
+
//repaint canvas elements
|
1323
|
+
if (this.is_drawing) {
|
1324
|
+
this._repaint(area, this.config.CL_DRAW_SHAPE, x, y);
|
1325
|
+
this._updatecoords(this.currentid);
|
1326
|
+
}
|
1327
|
+
};
|
1328
|
+
/**
|
1329
|
+
* EVENT HANDLER: Handles mouseup on the image.
|
1330
|
+
* Handles dragging and resizing.
|
1331
|
+
* @param e The event object.
|
1332
|
+
*/
|
1333
|
+
this.img_mouseup = function (e) {
|
1334
|
+
const windowEvent = window.event;
|
1335
|
+
var pos = this._getPos(this.imageElement), x = (this.isMSIE) ? (windowEvent.x + this.parentImageElement.scrollLeft - this.imageElement.offsetLeft) : (e.clientX - pos.x), y = (this.isMSIE) ? (windowEvent.y + this.parentImageElement.scrollTop - this.imageElement.offsetTop) : (e.clientY - pos.y);
|
1336
|
+
x = Math.round(x);
|
1337
|
+
y = Math.round(y);
|
1338
|
+
//for everything that is move or resize
|
1339
|
+
if (this.is_drawing != this.DM_RECTANGLE_DRAW &&
|
1340
|
+
this.is_drawing != this.DM_SQUARE_DRAW &&
|
1341
|
+
this.is_drawing != this.DM_POLYGON_DRAW &&
|
1342
|
+
this.is_drawing != this.DM_POLYGON_LASTDRAW) {
|
1343
|
+
//end dragging
|
1344
|
+
this.draggedId = null;
|
1345
|
+
//finish state
|
1346
|
+
this.is_drawing = 0;
|
1347
|
+
this.statusMessage(this.strings.READY);
|
1348
|
+
this.relaxArea(this.currentid);
|
1349
|
+
if (this.areas[this.currentid] == this._getLastArea()) {
|
1350
|
+
return;
|
1351
|
+
}
|
1352
|
+
this.memory[this.currentid].downx = x;
|
1353
|
+
this.memory[this.currentid].downy = y;
|
1354
|
+
}
|
1355
|
+
};
|
1356
|
+
this.img_dragstart = function (e) {
|
1357
|
+
e.preventDefault();
|
1358
|
+
};
|
1359
|
+
/**
|
1360
|
+
* EVENT HANDLER: Handles mousedown on the image.
|
1361
|
+
* Handles beggining or end of draw, or polygon point set.
|
1362
|
+
* @param e The event object.
|
1363
|
+
*/
|
1364
|
+
this.img_mousedown = function (e) {
|
1365
|
+
if (!e)
|
1366
|
+
e = window.event;
|
1367
|
+
var pos = this._getPos(this.imageElement), x = Math.round(e.clientX - pos.x), y = Math.round(e.clientY - pos.y);
|
1368
|
+
// Handle the Shift state
|
1369
|
+
if (e.shiftKey) {
|
1370
|
+
if (this.is_drawing == this.DM_POLYGON_DRAW) {
|
1371
|
+
this.is_drawing = this.DM_POLYGON_LASTDRAW;
|
1372
|
+
}
|
1373
|
+
}
|
1374
|
+
var area = this.areas[this.currentid];
|
1375
|
+
if (this.is_drawing == this.DM_POLYGON_DRAW) {
|
1376
|
+
//its not finish state yet
|
1377
|
+
area.xpoints[area.xpoints.length] = x;
|
1378
|
+
area.ypoints[area.ypoints.length] = y;
|
1379
|
+
this.memory[this.currentid].downx = x;
|
1380
|
+
this.memory[this.currentid].downy = y;
|
1381
|
+
return;
|
1382
|
+
}
|
1383
|
+
else if (this.is_drawing && this.is_drawing != this.DM_POLYGON_DRAW) {
|
1384
|
+
//finish any other state
|
1385
|
+
if (this.is_drawing == this.DM_POLYGON_LASTDRAW) {
|
1386
|
+
//add last controlpoint and update coords
|
1387
|
+
area.xpoints[area.xpoints.length] = x;
|
1388
|
+
area.ypoints[area.ypoints.length] = y;
|
1389
|
+
this._updatecoords(this.currentid);
|
1390
|
+
this.is_drawing = 0;
|
1391
|
+
this._polygonshrink(area);
|
1392
|
+
}
|
1393
|
+
this.is_drawing = 0;
|
1394
|
+
this.statusMessage(this.strings.READY);
|
1395
|
+
this.relaxArea(this.currentid);
|
1396
|
+
if (this.areas[this.currentid] == this._getLastArea()) {
|
1397
|
+
return;
|
1398
|
+
}
|
1399
|
+
return;
|
1400
|
+
}
|
1401
|
+
if (!this.nextShape) {
|
1402
|
+
return;
|
1403
|
+
}
|
1404
|
+
this.addNewArea();
|
1405
|
+
this.initArea(this.currentid, this.nextShape);
|
1406
|
+
if (this.areas[this.currentid].shape == 'poly') {
|
1407
|
+
this.is_drawing = this.DM_POLYGON_DRAW;
|
1408
|
+
this.statusMessage(this.strings.POLYGON_DRAW);
|
1409
|
+
this.areas[this.currentid].style.left = x + 'px';
|
1410
|
+
this.areas[this.currentid].style.top = y + 'px';
|
1411
|
+
this.areas[this.currentid].style.width = 0;
|
1412
|
+
this.areas[this.currentid].style.height = 0;
|
1413
|
+
this.areas[this.currentid].xpoints = [];
|
1414
|
+
this.areas[this.currentid].ypoints = [];
|
1415
|
+
this.areas[this.currentid].xpoints[0] = x;
|
1416
|
+
this.areas[this.currentid].ypoints[0] = y;
|
1417
|
+
}
|
1418
|
+
else if (this.areas[this.currentid].shape == 'rect') {
|
1419
|
+
this.is_drawing = this.DM_RECTANGLE_DRAW;
|
1420
|
+
this.statusMessage(this.strings.RECTANGLE_DRAW);
|
1421
|
+
this.areas[this.currentid].style.left = x + 'px';
|
1422
|
+
this.areas[this.currentid].style.top = y + 'px';
|
1423
|
+
this.areas[this.currentid].style.width = 0;
|
1424
|
+
this.areas[this.currentid].style.height = 0;
|
1425
|
+
}
|
1426
|
+
else if (this.areas[this.currentid].shape == 'circle') {
|
1427
|
+
this.is_drawing = this.DM_SQUARE_DRAW;
|
1428
|
+
this.statusMessage(this.strings.CIRCLE_DRAW);
|
1429
|
+
this.areas[this.currentid].style.left = x + 'px';
|
1430
|
+
this.areas[this.currentid].style.top = y + 'px';
|
1431
|
+
this.areas[this.currentid].style.width = 0;
|
1432
|
+
this.areas[this.currentid].style.height = 0;
|
1433
|
+
}
|
1434
|
+
this._setBorder(this.areas[this.currentid], 'DRAW');
|
1435
|
+
this.memory[this.currentid].downx = x;
|
1436
|
+
this.memory[this.currentid].downy = y;
|
1437
|
+
};
|
1438
|
+
/**
|
1439
|
+
* Highlights a given area.
|
1440
|
+
* Sets opacity and repaints.
|
1441
|
+
* @date 2007.12.28. 18:23:00
|
1442
|
+
* @param id The id of the area to blur.
|
1443
|
+
|
1444
|
+
*/
|
1445
|
+
this.highlightArea = function (id) {
|
1446
|
+
if (this.is_drawing) {
|
1447
|
+
return;
|
1448
|
+
} //exit if in drawing state
|
1449
|
+
var area = this.areas[id];
|
1450
|
+
if (area && area.shape != 'undefined') {
|
1451
|
+
//area exists - highlight it
|
1452
|
+
this._setBorder(area, 'HIGHLIGHT');
|
1453
|
+
this._setopacity(area, this.config.CL_HIGHLIGHT_BG, '-' + this.config.highlight_opacity);
|
1454
|
+
this._repaint(area, this.config.CL_HIGHLIGHT_SHAPE);
|
1455
|
+
}
|
1456
|
+
};
|
1457
|
+
/**
|
1458
|
+
* Blurs a given area.
|
1459
|
+
* Sets opacity and repaints.
|
1460
|
+
* @date 2007.12.28. 18:23:26
|
1461
|
+
* @param id The id of the area to blur.
|
1462
|
+
|
1463
|
+
*/
|
1464
|
+
this.blurArea = function (id) {
|
1465
|
+
if (this.is_drawing) {
|
1466
|
+
return;
|
1467
|
+
} //exit if in drawing state
|
1468
|
+
var area = this.areas[id];
|
1469
|
+
if (area && area.shape != 'undefined') {
|
1470
|
+
//area exists - fade it back
|
1471
|
+
this._setBorder(area, 'NORM');
|
1472
|
+
this._setopacity(area, this.config.CL_NORM_BG, '-' + this.config.norm_opacity);
|
1473
|
+
this._repaint(area, this.config.CL_NORM_SHAPE);
|
1474
|
+
}
|
1475
|
+
};
|
1476
|
+
/**
|
1477
|
+
* EVENT HANDLER: Handles event of mousemove on imgmap areas.
|
1478
|
+
* - changes cursor depending where we are inside the area (buggy in opera)
|
1479
|
+
* - handles area resize
|
1480
|
+
* - handles area move
|
1481
|
+
* @url http://evolt.org/article/Mission_Impossible_mouse_position/17/23335/index.html
|
1482
|
+
* @url http://my.opera.com/community/forums/topic.dml?id=239498&t=1217158015&page=1
|
1483
|
+
* @author adam
|
1484
|
+
* @param e The event object.
|
1485
|
+
*/
|
1486
|
+
this.area_mousemove = function (e) {
|
1487
|
+
if (!this.is_drawing) {
|
1488
|
+
if (!e)
|
1489
|
+
e = window.event;
|
1490
|
+
var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
|
1491
|
+
if (obj.tagName == 'DIV') {
|
1492
|
+
//do this because of label
|
1493
|
+
obj = obj.parentNode;
|
1494
|
+
}
|
1495
|
+
if (obj.tagName == 'image' || obj.tagName == 'group' ||
|
1496
|
+
obj.tagName == 'shape' || obj.tagName == 'stroke') {
|
1497
|
+
//do this because of excanvas
|
1498
|
+
obj = obj.parentNode.parentNode;
|
1499
|
+
}
|
1500
|
+
var target = e.target || e.srcElement, rect = target && target.getBoundingClientRect();
|
1501
|
+
const windowEvent = window.event;
|
1502
|
+
var xdiff = rect ? e.clientX - rect.left : windowEvent.offsetX;
|
1503
|
+
var ydiff = rect ? e.clientY - rect.top : windowEvent.offsetY;
|
1504
|
+
// Alfonso
|
1505
|
+
if (this.isSafari) {
|
1506
|
+
xdiff -= window.scrollX;
|
1507
|
+
ydiff -= window.scrollY;
|
1508
|
+
}
|
1509
|
+
var resizable = (obj.shape == 'rect' || obj.shape == 'circle');
|
1510
|
+
if (resizable && xdiff < 6 && ydiff > 6) {
|
1511
|
+
//move left
|
1512
|
+
obj.style.cursor = 'w-resize';
|
1513
|
+
}
|
1514
|
+
else if (resizable && xdiff > parseInt(obj.style.width, 10) - 6 && ydiff > 6) {
|
1515
|
+
//move right
|
1516
|
+
obj.style.cursor = 'e-resize';
|
1517
|
+
}
|
1518
|
+
else if (resizable && xdiff > 6 && ydiff < 6) {
|
1519
|
+
//move top
|
1520
|
+
obj.style.cursor = 'n-resize';
|
1521
|
+
}
|
1522
|
+
else if (resizable && ydiff > parseInt(obj.style.height, 10) - 6 && xdiff > 6) {
|
1523
|
+
//move bottom
|
1524
|
+
obj.style.cursor = 's-resize';
|
1525
|
+
}
|
1526
|
+
else {
|
1527
|
+
//move all
|
1528
|
+
obj.style.cursor = 'move';
|
1529
|
+
}
|
1530
|
+
if (obj.aid != this.draggedId) {
|
1531
|
+
//not dragged or different
|
1532
|
+
if (obj.style.cursor == 'move') {
|
1533
|
+
obj.style.cursor = 'default';
|
1534
|
+
}
|
1535
|
+
return;
|
1536
|
+
}
|
1537
|
+
var area = this.areas[this.currentid];
|
1538
|
+
//moved here from mousedown
|
1539
|
+
if (xdiff < 6 && ydiff > 6) {
|
1540
|
+
//move left
|
1541
|
+
if (area.shape == 'circle') {
|
1542
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_LEFT;
|
1543
|
+
this.statusMessage(this.strings.SQUARE_RESIZE_LEFT);
|
1544
|
+
}
|
1545
|
+
else if (area.shape == 'rect') {
|
1546
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_LEFT;
|
1547
|
+
this.statusMessage(this.strings.RECTANGLE_RESIZE_LEFT);
|
1548
|
+
}
|
1549
|
+
}
|
1550
|
+
else if (xdiff > parseInt(area.style.width, 10) - 6 && ydiff > 6) {
|
1551
|
+
//move right
|
1552
|
+
if (area.shape == 'circle') {
|
1553
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_RIGHT;
|
1554
|
+
this.statusMessage(this.strings.SQUARE_RESIZE_RIGHT);
|
1555
|
+
}
|
1556
|
+
else if (area.shape == 'rect') {
|
1557
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_RIGHT;
|
1558
|
+
this.statusMessage(this.strings.RECTANGLE_RESIZE_RIGHT);
|
1559
|
+
}
|
1560
|
+
}
|
1561
|
+
else if (xdiff > 6 && ydiff < 6) {
|
1562
|
+
//move top
|
1563
|
+
if (area.shape == 'circle') {
|
1564
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_TOP;
|
1565
|
+
this.statusMessage(this.strings.SQUARE_RESIZE_TOP);
|
1566
|
+
}
|
1567
|
+
else if (area.shape == 'rect') {
|
1568
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_TOP;
|
1569
|
+
this.statusMessage(this.strings.RECTANGLE_RESIZE_TOP);
|
1570
|
+
}
|
1571
|
+
}
|
1572
|
+
else if (ydiff > parseInt(area.style.height, 10) - 6 && xdiff > 6) {
|
1573
|
+
//move bottom
|
1574
|
+
if (area.shape == 'circle') {
|
1575
|
+
this.is_drawing = this.DM_SQUARE_RESIZE_BOTTOM;
|
1576
|
+
this.statusMessage(this.strings.SQUARE_RESIZE_BOTTOM);
|
1577
|
+
}
|
1578
|
+
else if (area.shape == 'rect') {
|
1579
|
+
this.is_drawing = this.DM_RECTANGLE_RESIZE_BOTTOM;
|
1580
|
+
this.statusMessage(this.strings.RECTANGLE_RESIZE_BOTTOM);
|
1581
|
+
}
|
1582
|
+
}
|
1583
|
+
else /*if (xdiff < 10 && ydiff < 10 ) */ {
|
1584
|
+
//move all
|
1585
|
+
if (area.shape == 'circle') {
|
1586
|
+
this.is_drawing = this.DM_SQUARE_MOVE;
|
1587
|
+
this.statusMessage(this.strings.SQUARE_MOVE);
|
1588
|
+
this.memory[this.currentid].rdownx = xdiff;
|
1589
|
+
this.memory[this.currentid].rdowny = ydiff;
|
1590
|
+
}
|
1591
|
+
else if (area.shape == 'rect') {
|
1592
|
+
this.is_drawing = this.DM_RECTANGLE_MOVE;
|
1593
|
+
this.statusMessage(this.strings.RECTANGLE_MOVE);
|
1594
|
+
this.memory[this.currentid].rdownx = xdiff;
|
1595
|
+
this.memory[this.currentid].rdowny = ydiff;
|
1596
|
+
}
|
1597
|
+
else if (area.shape == 'poly') {
|
1598
|
+
if (area.xpoints) {
|
1599
|
+
for (var i = 0, le = area.xpoints.length; i < le; i++) {
|
1600
|
+
this.memory[this.currentid].xpoints[i] = area.xpoints[i];
|
1601
|
+
this.memory[this.currentid].ypoints[i] = area.ypoints[i];
|
1602
|
+
}
|
1603
|
+
}
|
1604
|
+
if (area.shape == 'poly') {
|
1605
|
+
this.is_drawing = this.DM_POLYGON_MOVE;
|
1606
|
+
this.statusMessage(this.strings.POLYGON_MOVE);
|
1607
|
+
}
|
1608
|
+
this.memory[this.currentid].rdownx = xdiff;
|
1609
|
+
this.memory[this.currentid].rdowny = ydiff;
|
1610
|
+
}
|
1611
|
+
}
|
1612
|
+
//common memory settings (preparing to move or resize)
|
1613
|
+
this.memory[this.currentid].width = parseInt(area.style.width, 10);
|
1614
|
+
this.memory[this.currentid].height = parseInt(area.style.height, 10);
|
1615
|
+
this.memory[this.currentid].top = parseInt(area.style.top, 10);
|
1616
|
+
this.memory[this.currentid].left = parseInt(area.style.left, 10);
|
1617
|
+
this._setBorder(area, 'DRAW');
|
1618
|
+
this._setopacity(area, this.config.CL_DRAW_BG, this.config.draw_opacity);
|
1619
|
+
}
|
1620
|
+
else {
|
1621
|
+
//if drawing and not ie, have to propagate to image event
|
1622
|
+
this.img_mousemove(e);
|
1623
|
+
}
|
1624
|
+
};
|
1625
|
+
/**
|
1626
|
+
* EVENT HANDLER: Handles event of mouseup on imgmap areas.
|
1627
|
+
* Basically clears draggedId.
|
1628
|
+
* @author adam
|
1629
|
+
* @param e The event object
|
1630
|
+
*/
|
1631
|
+
this.area_mouseup = function (e) {
|
1632
|
+
if (!this.is_drawing) {
|
1633
|
+
var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
|
1634
|
+
if (obj.tagName == 'DIV') {
|
1635
|
+
//do this because of label
|
1636
|
+
obj = obj.parentNode;
|
1637
|
+
}
|
1638
|
+
if (obj.tagName == 'image' || obj.tagName == 'group' ||
|
1639
|
+
obj.tagName == 'shape' || obj.tagName == 'stroke') {
|
1640
|
+
//do this because of excanvas
|
1641
|
+
obj = obj.parentNode.parentNode;
|
1642
|
+
}
|
1643
|
+
if (this.areas[this.currentid] != obj) {
|
1644
|
+
//trying to draw on a different canvas,switch to this one
|
1645
|
+
if (typeof obj.aid == 'undefined') {
|
1646
|
+
this.log('Cannot identify target area', 1);
|
1647
|
+
return;
|
1648
|
+
}
|
1649
|
+
}
|
1650
|
+
this.draggedId = null;
|
1651
|
+
}
|
1652
|
+
else {
|
1653
|
+
//if drawing and not ie, have to propagate to image event
|
1654
|
+
this.img_mouseup(e);
|
1655
|
+
}
|
1656
|
+
};
|
1657
|
+
/**
|
1658
|
+
* EVENT HANDLER: Handles event of mouseover on imgmap areas.
|
1659
|
+
* Calls gradual highlight on the given area.
|
1660
|
+
* @author adam
|
1661
|
+
* @param e The event object
|
1662
|
+
*/
|
1663
|
+
this.area_mouseover = function (e) {
|
1664
|
+
if (!this.is_drawing) {
|
1665
|
+
//identify source object
|
1666
|
+
var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
|
1667
|
+
if (obj.tagName == 'DIV') {
|
1668
|
+
//do this because of label
|
1669
|
+
obj = obj.parentNode;
|
1670
|
+
}
|
1671
|
+
if (obj.tagName == 'image' || obj.tagName == 'group' ||
|
1672
|
+
obj.tagName == 'shape' || obj.tagName == 'stroke') {
|
1673
|
+
//do this because of excanvas
|
1674
|
+
obj = obj.parentNode.parentNode;
|
1675
|
+
}
|
1676
|
+
this.highlightArea(obj.aid);
|
1677
|
+
}
|
1678
|
+
};
|
1679
|
+
/**
|
1680
|
+
* EVENT HANDLER: Handles event of mouseout on imgmap areas.
|
1681
|
+
* Calls gradient blur on the given area.
|
1682
|
+
* @author adam
|
1683
|
+
* @param e The event object
|
1684
|
+
*/
|
1685
|
+
this.area_mouseout = function (e) {
|
1686
|
+
if (!this.is_drawing) {
|
1687
|
+
if (!e)
|
1688
|
+
e = window.event;
|
1689
|
+
if (this.isMSIE) {
|
1690
|
+
// When moving to a child, ignore this mouseout event
|
1691
|
+
if (e.toElement && e.srcElement == e.toElement.parentNode)
|
1692
|
+
return;
|
1693
|
+
}
|
1694
|
+
//identify source object
|
1695
|
+
var obj = (this.isMSIE) ? e.srcElement : e.currentTarget;
|
1696
|
+
var tagName = obj.tagName.toLowerCase();
|
1697
|
+
if (tagName == 'div') {
|
1698
|
+
//do this because of label
|
1699
|
+
obj = obj.parentNode;
|
1700
|
+
}
|
1701
|
+
if (tagName == 'image' || tagName == 'group' ||
|
1702
|
+
tagName == 'shape' || tagName == 'stroke') {
|
1703
|
+
//do this because of excanvas
|
1704
|
+
obj = obj.parentNode.parentNode;
|
1705
|
+
}
|
1706
|
+
// Only blur the area if it isn't the current one
|
1707
|
+
if (this.currentid != obj.aid)
|
1708
|
+
this.blurArea(obj.aid);
|
1709
|
+
}
|
1710
|
+
};
|
1711
|
+
/**
|
1712
|
+
* EVENT HANDLER: Handles event of mousedown on imgmap areas.
|
1713
|
+
* Sets the variables draggedid, selectedid and currentid to the given area.
|
1714
|
+
* @author adam
|
1715
|
+
* @param e The event object
|
1716
|
+
*/
|
1717
|
+
this.area_mousedown = function (e) {
|
1718
|
+
if (!this.is_drawing) {
|
1719
|
+
var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
|
1720
|
+
if (obj.tagName == 'DIV') {
|
1721
|
+
//do this because of label
|
1722
|
+
obj = obj.parentNode;
|
1723
|
+
}
|
1724
|
+
if (obj.tagName == 'image' || obj.tagName == 'group' ||
|
1725
|
+
obj.tagName == 'shape' || obj.tagName == 'stroke') {
|
1726
|
+
//do this because of excanvas
|
1727
|
+
obj = obj.parentNode.parentNode;
|
1728
|
+
}
|
1729
|
+
if (this.areas[this.currentid] != obj) {
|
1730
|
+
//trying to draw on a different canvas, switch to this one
|
1731
|
+
if (typeof obj.aid == 'undefined') {
|
1732
|
+
this.log('Cannot identify target area', 1);
|
1733
|
+
return;
|
1734
|
+
}
|
1735
|
+
this.blurArea(this.currentid);
|
1736
|
+
this.currentid = obj.aid;
|
1737
|
+
this.highlightArea(obj.aid);
|
1738
|
+
}
|
1739
|
+
this.draggedId = this.currentid;
|
1740
|
+
this.selectedId = this.currentid;
|
1741
|
+
this.fireEvent('onSelectArea', this.areas[this.currentid]);
|
1742
|
+
//stop event propagation to document level
|
1743
|
+
if (this.isMSIE) {
|
1744
|
+
window.event.cancelBubble = true;
|
1745
|
+
}
|
1746
|
+
else {
|
1747
|
+
e.stopPropagation();
|
1748
|
+
}
|
1749
|
+
}
|
1750
|
+
else {
|
1751
|
+
//if drawing and not ie, have to propagate to image event
|
1752
|
+
this.img_mousedown(e);
|
1753
|
+
}
|
1754
|
+
};
|
1755
|
+
/**
|
1756
|
+
* EVENT HANDLER: Handles event 'keydown' on document.
|
1757
|
+
* Handles SHIFT hold while drawing.
|
1758
|
+
* Note: Safari doesn't generate keyboard events for modifiers:
|
1759
|
+
* @url http://bugs.webkit.org/show_bug.cgi?id=11696
|
1760
|
+
* @author adam
|
1761
|
+
* @param e The event object
|
1762
|
+
*/
|
1763
|
+
this.doc_keydown = function (e) {
|
1764
|
+
if (e.keyCode == 46 || e.key == "Delete") {
|
1765
|
+
//delete key pressed
|
1766
|
+
if (this.selectedId !== null && !this.is_drawing) {
|
1767
|
+
this.removeArea(this.selectedId);
|
1768
|
+
}
|
1769
|
+
}
|
1770
|
+
else if (e.keyCode == 16 || e.key == "Shift") {
|
1771
|
+
//shift key pressed
|
1772
|
+
if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
|
1773
|
+
this.is_drawing = this.DM_SQUARE_DRAW;
|
1774
|
+
this.statusMessage(this.strings.SQUARE_DRAW);
|
1775
|
+
}
|
1776
|
+
}
|
1777
|
+
};
|
1778
|
+
/**
|
1779
|
+
* EVENT HANDLER: Handles event 'keyup' on document.
|
1780
|
+
* Handles SHIFT release while drawing.
|
1781
|
+
* @author adam
|
1782
|
+
* @param e The event object
|
1783
|
+
*/
|
1784
|
+
this.doc_keyup = function (e) {
|
1785
|
+
if (e.keyCode == 16 || e.key == "Shift") {
|
1786
|
+
//shift key released
|
1787
|
+
if (this.is_drawing == this.DM_SQUARE_DRAW && this.areas[this.currentid].shape == 'rect') {
|
1788
|
+
//not for circle!
|
1789
|
+
this.is_drawing = this.DM_RECTANGLE_DRAW;
|
1790
|
+
this.statusMessage(this.strings.RECTANGLE_DRAW);
|
1791
|
+
}
|
1792
|
+
}
|
1793
|
+
};
|
1794
|
+
/**
|
1795
|
+
* EVENT HANDLER: Handles event 'mousedown' on document.
|
1796
|
+
* @author adam
|
1797
|
+
* @param e The event object
|
1798
|
+
*/
|
1799
|
+
this.doc_mousedown = function (e) {
|
1800
|
+
if (!this.is_drawing) {
|
1801
|
+
this.selectedId = null;
|
1802
|
+
}
|
1803
|
+
};
|
1804
|
+
/**
|
1805
|
+
* Get the real position of the element.
|
1806
|
+
* Deal with browser differences when trying to get the position of an area.
|
1807
|
+
* @param element The element you want the position of.
|
1808
|
+
* @return An object with x and y members.
|
1809
|
+
*/
|
1810
|
+
this._getPos = function (element) {
|
1811
|
+
var bounding = element.getBoundingClientRect();
|
1812
|
+
return { x: bounding.left, y: bounding.top };
|
1813
|
+
};
|
1814
|
+
/**
|
1815
|
+
* Gets the last (visible and editable) area.
|
1816
|
+
* @author Adam Maschek (adam.maschek(at)gmail.com)
|
1817
|
+
* @date 2006-06-15 16:34:51
|
1818
|
+
* @returns The last area object or null.
|
1819
|
+
*/
|
1820
|
+
this._getLastArea = function () {
|
1821
|
+
for (var i = this.areas.length - 1; i >= 0; i--) {
|
1822
|
+
if (this.areas[i]) {
|
1823
|
+
return this.areas[i];
|
1824
|
+
}
|
1825
|
+
}
|
1826
|
+
return null;
|
1827
|
+
};
|
1828
|
+
/**
|
1829
|
+
* Parses cssText to single style declarations.
|
1830
|
+
* @author adam
|
1831
|
+
* @date 25-09-2007 18:19:51
|
1832
|
+
* @param obj The DOM object to apply styles on.
|
1833
|
+
* @param cssText The css declarations to apply.
|
1834
|
+
*/
|
1835
|
+
this.assignCSS = function (obj, cssText) {
|
1836
|
+
var parts = cssText.split(';');
|
1837
|
+
for (var i = 0; i < parts.length; i++) {
|
1838
|
+
var p = parts[i].split(':');
|
1839
|
+
//we need to camelcase by - signs
|
1840
|
+
var pp = trim(p[0]).split('-');
|
1841
|
+
var prop = pp[0];
|
1842
|
+
for (var j = 1; j < pp.length; j++) {
|
1843
|
+
//replace first letters to uppercase
|
1844
|
+
prop += pp[j].replace(/^\w/, pp[j].substring(0, 1).toUpperCase());
|
1845
|
+
}
|
1846
|
+
obj.style[trim(prop)] = trim(p[1]);
|
1847
|
+
}
|
1848
|
+
};
|
1849
|
+
/**
|
1850
|
+
* To fire callback hooks on custom events, passing them the object of the event.
|
1851
|
+
* @author adam
|
1852
|
+
* @date 13-10-2007 15:24:49
|
1853
|
+
* @param evt The type of event
|
1854
|
+
* @param obj The object of the event. (can be an id, a string, an object, whatever is most relevant)
|
1855
|
+
*/
|
1856
|
+
this.fireEvent = function (evt, obj) {
|
1857
|
+
if (typeof this.config.custom_callbacks[evt] == 'function') {
|
1858
|
+
return this.config.custom_callbacks[evt](obj);
|
1859
|
+
}
|
1860
|
+
};
|
1861
|
+
/**
|
1862
|
+
* To set area dimensions.
|
1863
|
+
* This is needed to achieve the same result in all browsers.
|
1864
|
+
* @author adam
|
1865
|
+
* @date 10-12-2007 22:29:41
|
1866
|
+
* @param id The id of the area (canvas) to resize.
|
1867
|
+
* @param w The desired width in pixels.
|
1868
|
+
* @param h The desired height in pixels.
|
1869
|
+
*/
|
1870
|
+
this.setAreaSize = function (id, w, h) {
|
1871
|
+
if (id === null) {
|
1872
|
+
id = this.currentid;
|
1873
|
+
}
|
1874
|
+
var area = this.areas[id];
|
1875
|
+
if (w !== null) {
|
1876
|
+
area.width = w;
|
1877
|
+
area.style.width = (w) + 'px';
|
1878
|
+
area.setAttribute('width', w);
|
1879
|
+
}
|
1880
|
+
if (h !== null) {
|
1881
|
+
area.height = h;
|
1882
|
+
area.style.height = (h) + 'px';
|
1883
|
+
area.setAttribute('height', h);
|
1884
|
+
}
|
1885
|
+
};
|
1886
|
+
/**
|
1887
|
+
* Disable selection on a given object.
|
1888
|
+
* This is especially useful in Safari, where dragging around areas
|
1889
|
+
* keeps selecting all sorts of things.
|
1890
|
+
* @author Bret Taylor
|
1891
|
+
* @url http://ajaxcookbook.org/disable-text-selection/
|
1892
|
+
* @date 27-07-2008 1:57:45
|
1893
|
+
* @param element The DOM element on which you want to disable selection.
|
1894
|
+
*/
|
1895
|
+
this.disableSelection = function (element) {
|
1896
|
+
if (typeof element == 'undefined' || !element) {
|
1897
|
+
return false;
|
1898
|
+
}
|
1899
|
+
if (typeof element.onselectstart != "undefined") {
|
1900
|
+
element.onselectstart = function () {
|
1901
|
+
return false;
|
1902
|
+
};
|
1903
|
+
}
|
1904
|
+
if (typeof element.unselectable != "undefined") {
|
1905
|
+
element.unselectable = "on";
|
1906
|
+
}
|
1907
|
+
if (typeof element.style.MozUserSelect != "undefined") {
|
1908
|
+
element.style.MozUserSelect = "none";
|
1909
|
+
}
|
1910
|
+
};
|
1911
|
+
this.config = {
|
1912
|
+
custom_callbacks: {},
|
1913
|
+
//default color values
|
1914
|
+
CL_DRAW_SHAPE: '#d00',
|
1915
|
+
CL_DRAW_BG: '#fff',
|
1916
|
+
CL_NORM_SHAPE: '#d00',
|
1917
|
+
CL_NORM_BG: '#fff',
|
1918
|
+
CL_HIGHLIGHT_SHAPE: '#d00',
|
1919
|
+
CL_HIGHLIGHT_BG: '#fff',
|
1920
|
+
CL_KNOB: '#555',
|
1921
|
+
bounding_box: true,
|
1922
|
+
label: '%n',
|
1923
|
+
label_class: 'imgmap_label',
|
1924
|
+
label_style: 'font: bold 10px Arial',
|
1925
|
+
hint: '#%n %h',
|
1926
|
+
draw_opacity: '35',
|
1927
|
+
norm_opacity: '50',
|
1928
|
+
highlight_opacity: '70',
|
1929
|
+
cursor_default: 'crosshair' //the css cursor while hovering over the image
|
1930
|
+
};
|
1931
|
+
//browser sniff
|
1932
|
+
const navigator = window.navigator;
|
1933
|
+
const userAgent = window.navigator.userAgent;
|
1934
|
+
this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
|
1935
|
+
this.isSafari = userAgent.indexOf('Safari') != -1;
|
1936
|
+
this.setup(options);
|
1937
|
+
}
|
1938
|
+
}
|
1939
|
+
/**
|
1940
|
+
* Trims a string.
|
1941
|
+
* Changed not to extend String but use own function for better compatibility.
|
1942
|
+
* @param str The string to trim.
|
1943
|
+
*/
|
1944
|
+
function trim(str) {
|
1945
|
+
return str.replace(/^\s+|\s+$/g, '');
|
1946
|
+
}
|
1947
|
+
;
|
1948
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW1zLWNrZWRpdG9yLWltYWdlbWFwLmxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Ftcy1hbmd1bGFyL3NyYy9saWIvcW1zLWNrZWRpdG9yLWNvbXBvbmVudHMvY29tcG9uZW50cy9xbXMtY2tlZGl0b3ItaW1hZ2VtYXAvcW1zLWNrZWRpdG9yLWltYWdlbWFwLmxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSDs7Ozs7Ozs7OztHQVVHO0FBQ0gsbUhBQW1IO0FBQ25ILHNFQUFzRTtBQXFEdEUsTUFBTSxPQUFPLHNCQUFzQjtJQWdHL0IsWUFBWSxPQUF5QjtRQS9GckMsK0JBQStCO1FBQy9CLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsMkJBQTJCO1FBQzNCLGNBQVMsR0FBRyxrQkFBa0IsQ0FBQztRQUUvQix3Q0FBd0M7UUFDeEMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFLcEIsbURBQW1EO1FBQ25ELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixxQ0FBcUM7UUFDckMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLCtDQUErQztRQUMvQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBRVosc0RBQXNEO1FBQy9DLFVBQUssR0FBRyxFQUFFLENBQUM7UUFLbEIscURBQXFEO1FBQ3JELGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUVuQix1REFBdUQ7UUFDdkQsZ0JBQVcsR0FBRztZQUNWLFdBQVc7WUFDWCxjQUFjO1lBQ2QsWUFBWTtZQUNaLGNBQWM7WUFDZCxZQUFZO1lBQ1osYUFBYTtZQUNiLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsZUFBZTtTQUNsQixD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LFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUU5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzdDO2lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRTtnQkFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMvQztpQkFDSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUU3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQy9DO1lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO1FBR0Y7Ozs7OztVQU1FO1FBQ0Ysa0JBQWEsR0FBRyxVQUFVLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUFFLE9BQU87YUFBRSxDQUFDLDBCQUEwQjtZQUMzRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksV0FBVyxFQUFFO2dCQUNuQyw0QkFBNEI7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDdkQ7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7O1VBTUU7UUFDRixhQUFRLEdBQUcsVUFBVSxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFBRSxPQUFPO2FBQUUsQ0FBQywwQkFBMEI7WUFDM0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsRUFBRTtnQkFDbkMsNEJBQTRCO2dCQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbEQ7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7Ozs7O1VBU0U7UUFDRixtQkFBYyxHQUFHLFVBQVUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLENBQUM7b0JBQ0YsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBRXJCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDcEUsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRTtvQkFDdEIsMEJBQTBCO29CQUMxQixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU87b0JBQ2hELEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksUUFBUSxFQUFFO29CQUNuRCw2QkFBNkI7b0JBQzdCLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztpQkFDbkM7Z0JBRUQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxFQUNqQyxJQUFJLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUVwRCxNQUFNLFdBQVcsR0FBUSxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztnQkFDL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBRTlELFVBQVU7Z0JBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNmLEtBQUssSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUN4QixLQUFLLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztpQkFDM0I7Z0JBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ3JDLFdBQVc7b0JBQ1gsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO2lCQUNqQztxQkFDSSxJQUFJLFNBQVMsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUMxRSxZQUFZO29CQUNaLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztpQkFDakM7cUJBQ0ksSUFBSSxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUMxQyxVQUFVO29CQUNWLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztpQkFDakM7cUJBQ0ksSUFBSSxTQUFTLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDM0UsYUFBYTtvQkFDYixHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7aUJBQ2pDO3FCQUNJO29CQUNELFVBQVU7b0JBQ1YsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDM0IsMEJBQTBCO29CQUMxQixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTt3QkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7cUJBQUU7b0JBQ2pFLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RDLDJCQUEyQjtnQkFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ3hCLFdBQVc7b0JBQ1gsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7d0JBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3FCQUN2RDt5QkFDSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFO3dCQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQzt3QkFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7cUJBQzFEO2lCQUNKO3FCQUNJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDOUQsWUFBWTtvQkFDWixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFO3dCQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7cUJBQ3hEO3lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztxQkFDM0Q7aUJBQ0o7cUJBQ0ksSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQzdCLFVBQVU7b0JBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7d0JBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUN0RDt5QkFDSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFO3dCQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7cUJBQ3pEO2lCQUNKO3FCQUNJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDL0QsYUFBYTtvQkFDYixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFO3dCQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7cUJBQ3pEO3lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO3dCQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztxQkFDNUQ7aUJBQ0o7cUJBQ0csbUNBQW1DLENBQUM7b0JBQ3BDLFVBQVU7b0JBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO3dCQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7d0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7cUJBQzlDO3lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO3dCQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7d0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7cUJBQzlDO3lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7d0JBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTs0QkFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUM1RDt5QkFDSjt3QkFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFOzRCQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7NEJBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDakQ7d0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztxQkFDOUM7aUJBQ0o7Z0JBRUQsc0RBQXNEO2dCQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM1RTtpQkFDSTtnQkFDRCx5REFBeUQ7Z0JBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekI7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7VUFLRTtRQUNGLGlCQUFZLEdBQUcsVUFBVSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3BFLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUU7b0JBQ3RCLDBCQUEwQjtvQkFDMUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7aUJBQ3hCO2dCQUNELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPO29CQUNoRCxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsRUFBRTtvQkFDbkQsNkJBQTZCO29CQUM3QixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ25DO2dCQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNuQyx5REFBeUQ7b0JBQ3pELElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLFdBQVcsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsT0FBTztxQkFDVjtpQkFDSjtnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN6QjtpQkFDSTtnQkFDRCx5REFBeUQ7Z0JBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkI7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7VUFLRTtRQUNGLG1CQUFjLEdBQUcsVUFBVSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQix3QkFBd0I7Z0JBQ3hCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDcEUsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRTtvQkFDdEIsMEJBQTBCO29CQUMxQixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU87b0JBQ2hELEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksUUFBUSxFQUFFO29CQUNuRCw2QkFBNkI7b0JBQzdCLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztpQkFDbkM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDL0I7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7VUFLRTtRQUNGLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQixJQUFJLENBQUMsQ0FBQztvQkFDRixDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFFckIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNiLHFEQUFxRDtvQkFDckQsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVO3dCQUNyRCxPQUFPO2lCQUNkO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pELElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRTtvQkFDbEIsMEJBQTBCO29CQUMxQixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPO29CQUN4QyxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxRQUFRLEVBQUU7b0JBQzNDLDZCQUE2QjtvQkFDN0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO2lCQUNuQztnQkFFRCxpREFBaUQ7Z0JBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsR0FBRztvQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDOUI7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7VUFLRTtRQUNGLG1CQUFjLEdBQUcsVUFBVSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3BFLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUU7b0JBQ3RCLDBCQUEwQjtvQkFDMUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7aUJBQ3hCO2dCQUNELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPO29CQUNoRCxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsRUFBRTtvQkFDbkQsNkJBQTZCO29CQUM3QixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ25DO2dCQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNuQywwREFBMEQ7b0JBQzFELElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLFdBQVcsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsT0FBTztxQkFDVjtvQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDL0I7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELDBDQUEwQztnQkFDMUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDcEM7cUJBQ0k7b0JBQ0QsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUN2QjthQUNKO2lCQUNJO2dCQUNELHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QjtRQUNMLENBQUMsQ0FBQztRQUdGOzs7Ozs7O1VBT0U7UUFDRixnQkFBVyxHQUFHLFVBQVUsQ0FBQztZQUNyQixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFO2dCQUN0QyxvQkFBb0I7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUFFO2FBQzFGO2lCQUNJLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUU7Z0JBQzFDLG1CQUFtQjtnQkFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO29CQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2hEO2FBQ0o7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7VUFLRTtRQUNGLGNBQVMsR0FBRyxVQUFVLENBQUM7WUFDbkIsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDckMsb0JBQW9CO2dCQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFO29CQUN0RixpQkFBaUI7b0JBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO29CQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ25EO2FBQ0o7UUFDTCxDQUFDLENBQUM7UUFHRjs7OztVQUlFO1FBQ0Ysa0JBQWEsR0FBRyxVQUFVLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1FBQ0wsQ0FBQyxDQUFDO1FBR0Y7Ozs7O1VBS0U7UUFDRixZQUFPLEdBQUcsVUFBVSxPQUFPO1lBRXZCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9DLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUdGOzs7OztVQUtFO1FBQ0YsaUJBQVksR0FBRztZQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hCO2FBQ0o7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUM7UUFHRjs7Ozs7O1VBTUU7UUFDRixjQUFTLEdBQUcsVUFBVSxHQUFHLEVBQUUsT0FBTztZQUM5QixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixpQ0FBaUM7Z0JBQ2pDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2hDLG9DQUFvQztvQkFDcEMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQ3JFO2dCQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1FBQ0wsQ0FBQyxDQUFDO1FBR0Y7Ozs7OztVQU1FO1FBQ0YsY0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUc7WUFDMUIsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxFQUFFO2dCQUN4RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakQ7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7Ozs7VUFRRTtRQUNGLGdCQUFXLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQUU7WUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEM7UUFDTCxDQUFDLENBQUM7UUFHRjs7Ozs7Ozs7VUFRRTtRQUNGLHFCQUFnQixHQUFHLFVBQVUsT0FBTztZQUNoQyxJQUFJLE9BQU8sT0FBTyxJQUFJLFdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQzthQUFFO1lBQ2hFLElBQUksT0FBTyxPQUFPLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRTtnQkFDN0MsT0FBTyxDQUFDLGFBQWEsR0FBRztvQkFDcEIsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQzthQUNMO1lBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLElBQUksV0FBVyxFQUFFO2dCQUM1QyxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUMvQjtZQUNELElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxXQUFXLEVBQUU7Z0JBQ25ELE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUN4QztRQUNMLENBQUMsQ0FBQztRQS80REUsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNWLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsc0JBQXNCO1lBQ3RCLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLGtCQUFrQixFQUFFLE1BQU07WUFDMUIsZUFBZSxFQUFFLE1BQU07WUFDdkIsT0FBTyxFQUFFLE1BQU07WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxjQUFjO1lBQzNCLFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxZQUFZLEVBQUUsSUFBSTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGNBQWMsRUFBRSxXQUFXLENBQUMsOENBQThDO1NBQzdFLENBQUM7UUFDRixlQUFlO1FBQ2YsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FzM0RKO0FBRUQ7Ozs7TUFJTTtBQUNOLFNBQVMsSUFBSSxDQUFDLEdBQUc7SUFDYixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqXHRJbWFnZSBNYXAgRWRpdG9yIChpbWdtYXApIC0gaW4tYnJvd3NlciBpbWFnZW1hcCBlZGl0b3JcclxuICpcdENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDggQWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsgQCBnbWFpbC5jb20pXHJcbiAqXHJcbiAqXHRUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXHJcbiAqXHRtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4gKlx0YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDJcclxuICpcdG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKlx0VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXHJcbiAqXHRidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxyXG4gKlx0TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4gKlx0R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICpcdFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXHJcbiAqXHRhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxyXG4gKlx0Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLlxyXG4gKi9cclxuLyoqXHJcbiAqXHRAZmlsZW92ZXJ2aWV3XHJcbiAqXHRPbmxpbmUgSW1hZ2UgTWFwIEVkaXRvciAtIG1haW4gc2NyaXB0IGZpbGUuXHJcbiAqXHRUaGlzIGlzIHRoZSBtYWluIHNjcmlwdCBmaWxlIG9mIHRoZSBPbmxpbmUgSW1hZ2UgTWFwIEVkaXRvci5cclxuICpcclxuICpcdEBkYXRlXHQyNi0wMi0yMDA3IDI6MjQ6NTBcclxuICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICpcdEBjb3B5cmlnaHRcclxuICpcdEB2ZXJzaW9uIDIuMlxyXG4gKlxyXG4gKi9cclxuLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgbmV3Y2FwOiBmYWxzZSwgd2hpdGU6IGZhbHNlLCBvbmV2YXI6IGZhbHNlLCBwbHVzcGx1czogZmFsc2UsIGVxZXFlcTogZmFsc2UsIG5vbWVuOiBmYWxzZSAqL1xyXG4vKmdsb2JhbCBpbWdtYXBTdHJpbmdzOnRydWUsIHdpbmRvdzpmYWxzZSwgR192bWxDYW52YXNNYW5hZ2VyOmZhbHNlICovXHJcblxyXG4vKipcclxuICpcdEBhdXRob3JcdEFkYW0gTWFzY2hla1xyXG4gKlx0QGNvbnN0cnVjdG9yXHJcbiAqXHRAcGFyYW0gY29uZmlnXHRUaGUgY29uZmlnIG9iamVjdC5cclxuICovXHJcbmludGVyZmFjZSBJSW1hZ2VNYXBDb25maWcge1xyXG4gICAgY3VzdG9tX2NhbGxiYWNrczogb2JqZWN0O1xyXG4gICAgQ0xfRFJBV19TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfRFJBV19CRzogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9CRzogc3RyaW5nO1xyXG4gICAgQ0xfSElHSExJR0hUX1NIQVBFOiBzdHJpbmc7XHJcbiAgICBDTF9ISUdITElHSFRfQkc6IHN0cmluZztcclxuICAgIENMX0tOT0I6IHN0cmluZztcclxuICAgIGJvdW5kaW5nX2JveDogYm9vbGVhbjtcclxuICAgIGxhYmVsOiBzdHJpbmc7IC8vdGhlIGZvcm1hdCBzdHJpbmcgb2YgdGhlIGFyZWEgbGFiZWxzIC0gcG9zc2libGUgdmFsdWVzOiAlbiAtIG51bWJlciwgJWMgLSBjb29yZHMsICVoIC0gaHJlZiwgJWEgLSBhbHQsICV0IC0gdGl0bGVcclxuICAgIGxhYmVsX2NsYXNzOiBzdHJpbmc7IC8vdGhlIGNzcyBjbGFzcyB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgIGxhYmVsX3N0eWxlOiBzdHJpbmc7IC8vdGhlIGNzcyBzdHlsZShzKSB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgIGhpbnQ6IHN0cmluZzsgLy90aGUgZm9ybWF0IHN0cmluZyBvZiB0aGUgYXJlYSBtb3VzZW92ZXIgaGludHMgLSBwb3NzaWJsZSB2YWx1ZXM6ICVuIC0gbnVtYmVyLCAlYyAtIGNvb3JkcywgJWggLSBocmVmLCAlYSAtIGFsdCwgJXQgLSB0aXRsZVxyXG4gICAgZHJhd19vcGFjaXR5OiBzdHJpbmc7IC8vdGhlIG9wYWNpdHkgdmFsdWUgb2YgdGhlIGFyZWEgd2hpbGUgZHJhd2luZywgbW92aW5nIG9yIHJlc2l6aW5nIC0gcG9zc2libGUgdmFsdWVzIDAgLSAxMDAgb3IgcmFuZ2UgXCIoeCkteVwiXHJcbiAgICBub3JtX29wYWNpdHk6IHN0cmluZzsgLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSByZWxheGVkIC0gcG9zc2libGUgdmFsdWVzIDAgLSAxMDBcdG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgaGlnaGxpZ2h0X29wYWNpdHk6IHN0cmluZzsgLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBoaWdobGlnaHRlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwIG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgY3Vyc29yX2RlZmF1bHQ6IHN0cmluZzsgLy90aGUgY3NzIGN1cnNvciB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSBpbWFnZVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZU1hcE9wdGlvbnMge1xyXG4gICAgaW1hZ2VFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGN1c3RvbV9jYWxsYmFja3M6IE9iamVjdDsvL1RPRE86IHR5cGluZ1xyXG4gICAgYm91bmRpbmdfYm94OiBib29sZWFuO1xyXG4gICAgQ0xfRFJBV19TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfSElHSExJR0hUX1NIQVBFOiBzdHJpbmc7XHJcbiAgICBzdHJpbmdzOiBPYmplY3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWFwRGF0YSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIGFyZWFzOiBJSW1hZ2VNYXBBcmVhW107XHJcbiAgICBpbWFnZVdpZHRoPzogbnVtYmVyO1xyXG4gICAgaW1hZ2VIZWlnaHQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWFwQXJlYSB7XHJcbiAgICBzaGFwZTogXCJyZWN0XCIgfCBcImNpcmNsZVwiIHwgXCJwb2x5XCIgfCBcIlwiO1xyXG4gICAgY29vcmRzOiBzdHJpbmc7XHJcbiAgICBocmVmOiBzdHJpbmc7XHJcbiAgICB0YXJnZXQ6IHN0cmluZztcclxuICAgIGFsdDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUU1TQ0tFZGl0b3JJbWFnZU1hcExpYiB7XHJcbiAgICAvKiogVmVyc2lvbiBzdHJpbmcgb2YgaW1nbWFwICovXHJcbiAgICB2ZXJzaW9uID0gXCIyLjJcIjtcclxuXHJcbiAgICAvKiogQnVpbGQgZGF0ZSBvZiBpbWdtYXAgKi9cclxuICAgIGJ1aWxkRGF0ZSA9IFwiMjAwOS8wOC8xMiAyMjoxOFwiO1xyXG5cclxuICAgIC8qKiBTZXF1ZW50aWFsIGJ1aWxkIG51bWJlciBvZiBpbWdtYXAgKi9cclxuICAgIGJ1aWxkTnVtYmVyID0gXCIxMTNcIjtcclxuXHJcbiAgICAvKiogQ29uZmlnIG9iamVjdCBvZiB0aGUgaW1nbWFwIGluc3RhbmNlICovXHJcbiAgICBjb25maWc6IElJbWFnZU1hcENvbmZpZztcclxuXHJcbiAgICAvKiogU3RhdHVzIGZsYWcgdG8gaW5kaWNhdGUgY3VycmVudCBkcmF3aW5nIG1vZGUgKi9cclxuICAgIGlzX2RyYXdpbmcgPSAwO1xyXG5cclxuICAgIC8qKlx0QXJyYXkgdG8gaG9sZCBsYW5ndWFnZSBzdHJpbmdzICovXHJcbiAgICBzdHJpbmdzID0gW107XHJcblxyXG4gICAgLyoqIEhlbHBlciBhcnJheSBmb3Igc29tZSBkcmF3aW5nIG9wZXJhdGlvbnMgKi9cclxuICAgIG1lbW9yeSA9IFtdO1xyXG5cclxuICAgIC8qKlx0QXJyYXkgdG8gaG9sZCByZWZlcmVuY2UgdG8gYWxsIGFyZWFzIChjYW52YXNlcykgKi9cclxuICAgIHB1YmxpYyBhcmVhcyA9IFtdO1xyXG5cclxuICAgIGltYWdlRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwYXJlbnRJbWFnZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKlx0QXNzb2NpYXRpdmUgYXJyYXkgdG8gaG9sZCBib3VuZCBldmVudCBoYW5kbGVycyAqL1xyXG4gICAgZXZlbnRIYW5kbGVycyA9IHt9O1xyXG5cclxuICAgIGN1cnJlbnRpZCA9IDA7XHJcbiAgICBkcmFnZ2VkSWQgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRJZCA9IG51bGw7XHJcbiAgICBuZXh0U2hhcGUgPSAncmVjdCc7XHJcblxyXG4gICAgLyoqXHRDYWxsYmFjayBldmVudHMgdGhhdCB5b3UgY2FuIGhhbmRsZSBpbiB5b3VyIEdVSS4gKi9cclxuICAgIGV2ZW50X3R5cGVzID0gW1xyXG4gICAgICAgICdvbkFkZEFyZWEnLFxyXG4gICAgICAgICdvblJlbW92ZUFyZWEnLFxyXG4gICAgICAgICdvbkRyYXdBcmVhJyxcclxuICAgICAgICAnb25SZXNpemVBcmVhJyxcclxuICAgICAgICAnb25Nb3ZlQXJlYScsXHJcbiAgICAgICAgJ29uTG9hZEltYWdlJyxcclxuICAgICAgICAnb25TZWxlY3RBcmVhJyxcclxuICAgICAgICAnb25TdGF0dXNNZXNzYWdlJyxcclxuICAgICAgICAnb25BcmVhQ2hhbmdlZCdcclxuICAgIF07XHJcblxyXG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcdGhvbGRzIHRoZSBuYW1lIG9mIHRoZSBhY3RpdmVseSBlZGl0ZWQgbWFwLCB1c2UgZ2V0TWFwTmFtZSB0byByZWFkIGl0ICovXHJcbiAgICBtYXBuYW1lID0gJyc7XHJcblxyXG4gICAgLyoqXHRob2xkcyB0aGUgaWQgb2YgdGhlIGFjdGl2ZWx5IGVkaXRlZCBtYXAsIHVzZSBnZXRNYXBJZHRvIHJlYWQgaXQgKi9cclxuICAgIG1hcGlkID0gJyc7XHJcblxyXG4gICAgLyoqIGdsb2JhbCBzY2FsZSBvZiBhcmVhcyAoMS1ub3JtYWwsIDItZG91YmxlZCwgMC41LWhhbGYsIGV0Yy4pICovXHJcbiAgICBnbG9iYWxzY2FsZSA9IDE7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9SRUNUQU5HTEVfRFJBVyA9IDE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9NT1ZFID0gMTE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QID0gMTI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9SRVNJWkVfUklHSFQgPSAxMztcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fUkVDVEFOR0xFX1JFU0laRV9CT1RUT00gPSAxNDtcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fUkVDVEFOR0xFX1JFU0laRV9MRUZUID0gMTU7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9TUVVBUkVfRFJBVyA9IDI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9NT1ZFID0gMjE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9SRVNJWkVfVE9QID0gMjI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9SRVNJWkVfUklHSFQgPSAyMztcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fU1FVQVJFX1JFU0laRV9CT1RUT00gPSAyNDtcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fU1FVQVJFX1JFU0laRV9MRUZUID0gMjU7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9QT0xZR09OX0RSQVcgPSAzO1xyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9QT0xZR09OX0xBU1REUkFXID0gMzA7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1BPTFlHT05fTU9WRSA9IDMxO1xyXG5cclxuICAgIC8vYnJvd3NlciBzbmlmZlxyXG4gICAgaXNNU0lFID0gZmFsc2U7XHJcbiAgICBpc1NhZmFyaSA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSUltYWdlTWFwT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICAgICAgICBjdXN0b21fY2FsbGJhY2tzOiB7fSwgLy9wb3NzaWJsZSB2YWx1ZXM6IHNlZSBiZWxvdyFcclxuICAgICAgICAgICAgLy9kZWZhdWx0IGNvbG9yIHZhbHVlc1xyXG4gICAgICAgICAgICBDTF9EUkFXX1NIQVBFOiAnI2QwMCcsXHJcbiAgICAgICAgICAgIENMX0RSQVdfQkc6ICcjZmZmJyxcclxuICAgICAgICAgICAgQ0xfTk9STV9TSEFQRTogJyNkMDAnLFxyXG4gICAgICAgICAgICBDTF9OT1JNX0JHOiAnI2ZmZicsXHJcbiAgICAgICAgICAgIENMX0hJR0hMSUdIVF9TSEFQRTogJyNkMDAnLFxyXG4gICAgICAgICAgICBDTF9ISUdITElHSFRfQkc6ICcjZmZmJyxcclxuICAgICAgICAgICAgQ0xfS05PQjogJyM1NTUnLFxyXG4gICAgICAgICAgICBib3VuZGluZ19ib3g6IHRydWUsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnJW4nLC8vdGhlIGZvcm1hdCBzdHJpbmcgb2YgdGhlIGFyZWEgbGFiZWxzIC0gcG9zc2libGUgdmFsdWVzOiAlbiAtIG51bWJlciwgJWMgLSBjb29yZHMsICVoIC0gaHJlZiwgJWEgLSBhbHQsICV0IC0gdGl0bGVcclxuICAgICAgICAgICAgbGFiZWxfY2xhc3M6ICdpbWdtYXBfbGFiZWwnLC8vdGhlIGNzcyBjbGFzcyB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgICAgICAgICAgbGFiZWxfc3R5bGU6ICdmb250OiBib2xkIDEwcHggQXJpYWwnLC8vdGhlIGNzcyBzdHlsZShzKSB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgICAgICAgICAgaGludDogJyMlbiAlaCcsLy90aGUgZm9ybWF0IHN0cmluZyBvZiB0aGUgYXJlYSBtb3VzZW92ZXIgaGludHMgLSBwb3NzaWJsZSB2YWx1ZXM6ICVuIC0gbnVtYmVyLCAlYyAtIGNvb3JkcywgJWggLSBocmVmLCAlYSAtIGFsdCwgJXQgLSB0aXRsZVxyXG4gICAgICAgICAgICBkcmF3X29wYWNpdHk6ICczNScsLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBkcmF3aW5nLCBtb3Zpbmcgb3IgcmVzaXppbmcgLSBwb3NzaWJsZSB2YWx1ZXMgMCAtIDEwMCBvciByYW5nZSBcIih4KS15XCJcclxuICAgICAgICAgICAgbm9ybV9vcGFjaXR5OiAnNTAnLC8vdGhlIG9wYWNpdHkgdmFsdWUgb2YgdGhlIGFyZWEgd2hpbGUgcmVsYXhlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwXHRvciByYW5nZSBcIih4KS15XCJcclxuICAgICAgICAgICAgaGlnaGxpZ2h0X29wYWNpdHk6ICc3MCcsLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBoaWdobGlnaHRlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwIG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgICAgICAgICBjdXJzb3JfZGVmYXVsdDogJ2Nyb3NzaGFpcicgLy90aGUgY3NzIGN1cnNvciB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSBpbWFnZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9icm93c2VyIHNuaWZmXHJcbiAgICAgICAgY29uc3QgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcclxuICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgICAgICB0aGlzLmlzTVNJRSA9IChuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKTtcclxuICAgICAgICB0aGlzLmlzU2FmYXJpID0gdXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaScpICE9IC0xO1xyXG4gICAgICAgIHRoaXMuc2V0dXAob3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlx0TWFpbiBzZXR1cCBmdW5jdGlvbi5cclxuICAgICAqXHRDYW4gYmUgY2FsbGVkIG1hbnVhbGx5IG9yIGNvbnN0cnVjdG9yIHdpbGwgY2FsbCBpdC5cclxuICAgICAqXHRAZGF0ZVx0MjItMDItMjAwNyAwOjE1OjQyXHJcbiAgICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgICpcdEBwYXJhbVx0Y29uZmlnXHRjb25maWcgb2JqZWN0XHJcbiAgICAgKlx0QHJldHVyblx0VHJ1ZSBpZiBhbGwgd2VudCBvay5cclxuICAgICAqL1xyXG4gICAgc2V0dXAgPSBmdW5jdGlvbiAob3B0aW9uczogSUltYWdlTWFwT3B0aW9ucykge1xyXG4gICAgICAgIC8vY29weSBub24tZGVmYXVsdCBvcHRpb25zIHBhcmFtZXRlcnMgdG8gdGhpcy5jb25maWdcclxuICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnW2ldID0gb3B0aW9uc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zZXQgZG9jdW1lbnQgZXZlbnQgaG9va3NcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuZXZlbnRIYW5kbGVycy5kb2Nfa2V5ZG93biA9IHRoaXMuZG9jX2tleWRvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudChkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5ldmVudEhhbmRsZXJzLmRvY19rZXl1cCA9IHRoaXMuZG9jX2tleXVwLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnQoZG9jdW1lbnQsICdtb3VzZWRvd24nLCB0aGlzLmV2ZW50SGFuZGxlcnMuZG9jX21vdXNlZG93biA9IHRoaXMuZG9jX21vdXNlZG93bi5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgLy9zZXQgaW1hZ2VFbGVtZW50IGVsZW1lbnQgLSBzdXBwb3NlZGx5IGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBET01cclxuICAgICAgICB0aGlzLmltYWdlRWxlbWVudCA9IG9wdGlvbnMuaW1hZ2VFbGVtZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5pbWFnZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ1RoZSBpbWFnZSBlbGVtZW50IG11c3QgYmUgZXhpc3RlZCBpbiB0aGUgRE9NJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93ICdUaGUgcGFyZW50IG9mIHRoZSBpbWFnZSBlbGVtZW50IG11c3QgYmUgZXhpc3RlZCBpbiB0aGUgRE9NJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50ID0gdGhpcy5pbWFnZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgIHRoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnBhcmVudEltYWdlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIC8vd2lwZSBhbGxcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbEFyZWFzKCk7XHJcblxyXG4gICAgICAgIC8vcmVzZXQgc2NhbGVcclxuICAgICAgICB0aGlzLmdsb2JhbHNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLy9zZXR1cCBldmVudHNcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KHRoaXMuaW1hZ2VFbGVtZW50LCBcImRyYWdzdGFydFwiLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX2RyYWdzdGFydCA9IHRoaXMuaW1nX2RyYWdzdGFydC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KHRoaXMuaW1hZ2VFbGVtZW50LCAnbW91c2Vkb3duJywgdGhpcy5ldmVudEhhbmRsZXJzLmltZ19tb3VzZWRvd24gPSB0aGlzLmltZ19tb3VzZWRvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudCh0aGlzLmltYWdlRWxlbWVudCwgJ21vdXNldXAnLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNldXAgPSB0aGlzLmltZ19tb3VzZXVwLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnQodGhpcy5pbWFnZUVsZW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNlbW92ZSA9IHRoaXMuaW1nX21vdXNlbW92ZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS5jdXJzb3IgPSB0aGlzLmNvbmZpZy5jdXJzb3JfZGVmYXVsdDtcclxuXHJcbiAgICAgICAgLy9Mb2FkIHN0cmluZ3MgZnJvbSBhIGtleTp2YWx1ZSBvYmplY3RcclxuICAgICAgICBpZiAob3B0aW9ucy5zdHJpbmdzKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnN0cmluZ3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZ3MuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nc1trZXldID0gb3B0aW9ucy5zdHJpbmdzW2tleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy92YWxpZGF0ZSBldmVudCBob29rc1xyXG4gICAgICAgIHZhciBmb3VuZCwgaiwgbGU7XHJcbiAgICAgICAgZm9yIChpIGluIHRoaXMuY29uZmlnLmN1c3RvbV9jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbV9jYWxsYmFja3MuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBsZSA9IHRoaXMuZXZlbnRfdHlwZXMubGVuZ3RoOyBqIDwgbGU7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IHRoaXMuZXZlbnRfdHlwZXNbal0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1RPRE86IHJlbW92ZSBpbnZhbGlkIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coXCJVbmtub3duIGN1c3RvbSBjYWxsYmFjazogXCIgKyBpLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEF0dGFjaCBuZXcgJ2V2dCcgZXZlbnQgaGFuZGxlciAnY2FsbGJhY2snIHRvICdvYmonXHJcbiAgICAqXHRAZGF0ZVx0MjQtMDItMjAwNyAyMToxNjoyMFxyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZGVmaW5lZC5cclxuICAgICpcdEBwYXJhbVx0ZXZ0XHRUaGUgbmFtZSBvZiB0aGUgZXZlbnQsIGxpa2UgbW91c2Vkb3duLlxyXG4gICAgKlx0QHBhcmFtXHRjYWxsYmFja1x0VGhlIGNhbGxiYWNrIGZ1bmN0aW9uIChuYW1lZCBpZiB5b3Ugd2FudCBpdCB0byBiZSByZW1vdmVkKS5cclxuICAgICovXHJcbiAgICBhZGRFdmVudCA9IGZ1bmN0aW9uIChvYmosIGV2dCwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAob2JqLmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgLy9XM0Mgc3R5bGUgbW9kZWxcclxuICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBjYWxsYmFjaywgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTWljcm9zb2Z0IHN0eWxlIHJlZ2lzdHJhdGlvbiBtb2RlbFxyXG4gICAgICAgICAgICByZXR1cm4gb2JqLmF0dGFjaEV2ZW50KFwib25cIiArIGV2dCwgY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHREZXRhY2ggJ2V2dCcgZXZlbnQgaGFuZGxlZCBieSAnY2FsbGJhY2snIGZyb20gJ29iaicgb2JqZWN0LlxyXG4gICAgKlx0Q2FsbGJhY2sgbXVzdCBiZSBhIG5vbiBhbm9ueW1vdXMgZnVuY3Rpb24sIHNlZSBldmVudEhhbmRsZXJzLlxyXG4gICAgKlx0QHNlZVx0I2V2ZW50SGFuZGxlcnNcclxuICAgICpcdEV4YW1wbGU6IG15aW1nbWFwLnJlbW92ZUV2ZW50KG15aW1nbWFwLnBpYywgJ21vdXNlZG93bicsIG15aW1nbWFwLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNlZG93bik7XHJcbiAgICAqXHRAZGF0ZVx0MjQtMTEtMjAwNyAxNToyMjoxN1xyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZGVmaW5lZC5cclxuICAgICpcdEBwYXJhbVx0ZXZ0XHRUaGUgbmFtZSBvZiB0aGUgZXZlbnQsIGxpa2UgbW91c2Vkb3duLlxyXG4gICAgKlx0QHBhcmFtXHRjYWxsYmFja1x0VGhlIG5hbWVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgKi9cclxuICAgIHJlbW92ZUV2ZW50ID0gZnVuY3Rpb24gKG9iaiwgZXZ0LCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAvL1czQyBzdHlsZSBtb2RlbFxyXG4gICAgICAgICAgICBvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGNhbGxiYWNrLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9NaWNyb3NvZnQgc3R5bGUgZGV0YWNoIG1vZGVsXHJcbiAgICAgICAgICAgIHJldHVybiBvYmouZGV0YWNoRXZlbnQoXCJvblwiICsgZXZ0LCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRGaXJlcyBjdXN0b20gaG9vayBvblN0YXR1c01lc3NhZ2UsIHBhc3NpbmcgdGhlIHN0YXR1cyBzdHJpbmcuXHJcbiAgICAqXHRVc2UgdGhpcyB0byB1cGRhdGUgeW91ciBHVUkuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjYtMDctMjAwOCAxMzoyMjo1NFxyXG4gICAgKlx0QHBhcmFtXHRzdHJcdFRoZSBzdGF0dXMgc3RyaW5nXHJcbiAgICAqL1xyXG4gICAgc3RhdHVzTWVzc2FnZSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25TdGF0dXNNZXNzYWdlJywgc3RyKTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0QWRkcyBiYXNpYyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkgdXNpbmcgZmlyZWJ1ZyBjb25zb2xlIG9iamVjdCBpZiBhdmFpbGFibGUuXHJcbiAgICAqXHRAZGF0ZVx0MjAtMDItMjAwNyAxNzo1NToxOFxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb3Igc3RyaW5nIHlvdSB3YW50IHRvIGRlYnVnL2VjaG8uXHJcbiAgICAqL1xyXG4gICAgbG9nID0gZnVuY3Rpb24gKG9iaiwgbGV2ZWwpIHtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0R2V0IHRoZSBtYXAgbmFtZSBvZiB0aGUgY3VycmVudCBpbWFnZW1hcC5cclxuICAgICpcdElmIGRvZXNudCBleGlzdCwgbm9yIG1hcCBpZCwgZ2VuZXJhdGUgYSBuZXcgbmFtZSBiYXNlZCBvbiB0aW1lc3RhbXAuXHJcbiAgICAqXHRUaGUgbW9zdCBwb3J0YWJsZSBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIGlkIGFuZCBuYW1lLlxyXG4gICAgKlx0VGhpcyBhbHNvIGNvbmZvcm1zIHRoZSBIVE1MIDUgc3BlY2lmaWNhdGlvbiwgdGhhdCBzYXlzOlxyXG4gICAgKlx0XCJJZiB0aGUgaWQgIGF0dHJpYnV0ZSBpcyBhbHNvIHNwZWNpZmllZCwgYm90aCBhdHRyaWJ1dGVzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS5cIlxyXG4gICAgKlx0QGxpbmtcdGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvaHRtbDUvI3RoZS1tYXAtZWxlbWVudFxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QHNlZVx0I2dldE1hcElkXHJcbiAgICAqXHRAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBtYXAuXHJcbiAgICAqL1xyXG4gICAgZ2V0TWFwTmFtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWFwbmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoISF0aGlzLm1hcGlkKSB7IHJldHVybiB0aGlzLm1hcGlkOyB9XHJcbiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcG5hbWUgPSAnaW1hZ2VtYXAnICsgbm93LmdldEZ1bGxZZWFyKCkgKyAobm93LmdldE1vbnRoKCkgKyAxKSArIG5vdy5nZXREYXRlKCkgKyBub3cuZ2V0SG91cnMoKSArIG5vdy5nZXRNaW51dGVzKCkgKyBub3cuZ2V0U2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5tYXBuYW1lO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHZXQgdGhlIG1hcCBpZCBvZiB0aGUgY3VycmVudCBpbWFnZW1hcC5cclxuICAgICpcdElmIGRvZXNudCBleGlzdCwgdXNlIG1hcCBuYW1lLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QHNlZVx0I2dldE1hcE5hbWVcclxuICAgICpcdEByZXR1cm5cdFRoZSBpZCBvZiB0aGUgbWFwLlxyXG4gICAgKi9cclxuICAgIGdldE1hcElkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tYXBpZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1hcGlkID0gdGhpcy5nZXRNYXBOYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hcGlkO1xyXG4gICAgfTtcclxuXHJcbiAgICBnZXRNYXBKc29uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBtYXBKc29uOiBJSW1hZ2VNYXBEYXRhID0ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdldE1hcE5hbWUoKSxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0TWFwSWQoKSxcclxuICAgICAgICAgICAgYXJlYXM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5hcmVhc1tpXTtcclxuICAgICAgICAgICAgaWYgKGFyZWEgJiYgYXJlYS5sYXN0SW5wdXQgJiYgYXJlYS5zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJlYUpzb246IElJbWFnZU1hcEFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzOiBhcmVhLmxhc3RJbnB1dCxcclxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogYXJlYS5zaGFwZSxcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGFyZWEuYXRhcmdldCxcclxuICAgICAgICAgICAgICAgICAgICBhbHQ6IGFyZWEuYWFsdCxcclxuICAgICAgICAgICAgICAgICAgICBocmVmOiBhcmVhLmFocmVmXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgbWFwSnNvbi5hcmVhcy5wdXNoKGFyZWFKc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFwSnNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICpcdENvbnZlcnQgd2lsZCBzaGFwZSBuYW1lcyB0byBub3JtYWwgb25lcy5cclxuICAgICpcdEBkYXRlXHQyNS0xMi0yMDA4IDE5OjI3OjA2XHJcbiAgICAqXHRAcGFyYW1cdHNoYXBlXHRUaGUgbmFtZSBvZiB0aGUgc2hhcGUgdG8gY29udmVydC5cclxuICAgICpcdEByZXR1cm5cdFRoZSBub3JtYWxpemVkIHNoYXBlIG5hbWUsIHJlY3QgYXMgZGVmYXVsdC5cclxuICAgICovXHJcbiAgICBfbm9ybVNoYXBlID0gZnVuY3Rpb24gKHNoYXBlKSB7XHJcbiAgICAgICAgaWYgKCFzaGFwZSkgeyByZXR1cm4gJ3JlY3QnOyB9XHJcbiAgICAgICAgc2hhcGUgPSB0cmltKHNoYXBlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzaGFwZS5zdWJzdHJpbmcoMCwgNCkgPT0gJ3JlY3QnKSB7IHJldHVybiAncmVjdCc7IH1cclxuICAgICAgICBpZiAoc2hhcGUuc3Vic3RyaW5nKDAsIDQpID09ICdjaXJjJykgeyByZXR1cm4gJ2NpcmNsZSc7IH1cclxuICAgICAgICBpZiAoc2hhcGUuc3Vic3RyaW5nKDAsIDQpID09ICdwb2x5JykgeyByZXR1cm4gJ3BvbHknOyB9XHJcbiAgICAgICAgcmV0dXJuICdyZWN0JztcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0VHJ5IHRvIG5vcm1hbGl6ZSBjb29yZGluYXRlcyB0aGF0IGNhbWUgZnJvbTpcclxuICAgICpcdDEuIGh0bWwgdGV4dGFyZWFcclxuICAgICpcdDIuIHVzZXIgaW5wdXQgaW4gdGhlIGFjdGl2ZSBhcmVhJ3MgaW5wdXQgZmllbGRcclxuICAgICpcdDMuIGZyb20gdGhlIGh0bWwgc291cmNlIGluIGNhc2Ugb2YgcGx1Z2lucyBvciBoaWdobGlnaHRlclxyXG4gICAgKlx0RXhhbXBsZSBvZiBpbnB1dHMgdGhhdCBuZWVkIHRvIGJlIGhhbmRsZWQ6XHJcbiAgICAqXHRcdDAzNSwwMzUgMDc1LDA2MlxyXG4gICAgKlx0XHQxNTAsMjE3LCAxOTAsMjU3LCAxNTAsMjk3LDExMCwyNTdcclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0Y29vcmRzXHRUaGUgY29vcmRpbmF0ZXMgaW4gYSBzdHJpbmcuXHJcbiAgICAqXHRAcGFyYW1cdHNoYXBlXHRUaGUgc2hhcGUgb2YgdGhlIG9iamVjdCAocmVjdCwgY2lyY2xlLCBwb2x5KS5cclxuICAgICpcdEBwYXJhbVx0ZmxhZ1x0RmxhZ3MgdGhhdCBtb2RpZnkgdGhlIG9wZXJhdGlvbi4gKGZyb21jaXJjbGUsIGZyb21wb2x5LCBmcm9tcmVjdCwgcHJlc2VydmUpXHJcbiAgICAqXHRAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBjb29yZGluYXRlcy5cclxuICAgICovXHJcbiAgICBfbm9ybUNvb3JkcyA9IGZ1bmN0aW9uIChjb29yZHMsIHNoYXBlLCBmbGFnKSB7XHJcbiAgICAgICAgLy9mdW5jdGlvbiBsZXZlbCB2YXIgZGVjbGFyYXRpb25zXHJcbiAgICAgICAgdmFyIGk7IC8vZ2VuZXJpYyBjeWNsZSBjb3VudGVyXHJcbiAgICAgICAgdmFyIHN4OyAvL3NtYWxsZXN0IHhcclxuICAgICAgICB2YXIgc3k7IC8vc21hbGxlc3QgeVxyXG4gICAgICAgIHZhciBneDsgLy9ncmVhdGVzdCB4XHJcbiAgICAgICAgdmFyIGd5OyAvL2dyZWF0ZXN0IHlcclxuICAgICAgICB2YXIgdGVtcCwgbGU7XHJcblxyXG4gICAgICAgIGNvb3JkcyA9IHRyaW0oY29vcmRzKTtcclxuICAgICAgICBpZiAoY29vcmRzID09PSAnJykgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICB2YXIgb2xkY29vcmRzID0gY29vcmRzO1xyXG4gICAgICAgIC8vcmVwbGFjZSBzb21lIGdlbmVyYWwganVua1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8oXFxkKShbXlxcZFxcLl0pKyhcXGQpL2csIFwiJDEsJDNcIik7IC8vIE90aGVyIHNvZnR3YXJlIG1pZ2h0IGNyZWF0ZSBkZWNpbWFsIHBvaW50cywgcmVzcGVjdCB0aGVtXHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoLyxcXEQrKFxcZCkvZywgXCIsJDFcIik7IC8vY3V0IGxlYWRpbmcganVua1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8sMCsoXFxkKS9nLCBcIiwkMVwiKTsgLy9jdXQgbGVhZGluZyB6ZXJvc1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8oXFxkKShcXEQpKywvZywgXCIkMSxcIik7XHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoL15cXEQrKFxcZCkvZywgXCIkMVwiKTsgLy9jdXQgbGVhZGluZyBqdW5rXHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoL14wKyhcXGQpL2csIFwiJDFcIik7IC8vY3V0IGxlYWRpbmcgemVyb3NcclxuICAgICAgICBjb29yZHMgPSBjb29yZHMucmVwbGFjZSgvKFxcZCkoXFxEKSskL2csIFwiJDFcIik7IC8vY3V0IHRyYWlsaW5nIGp1bmtcclxuXHJcbiAgICAgICAgLy9ub3cgZml4IG90aGVyIGlzc3Vlc1xyXG4gICAgICAgIHZhciBwYXJ0cyA9IGNvb3Jkcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChzaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgaWYgKGZsYWcgPT0gJ2Zyb21jaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgciA9IHBhcnRzWzJdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXSAtIHI7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdIC0gcjtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKSArIDIgKiByO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbM10gPSBwYXJzZUludChwYXJ0c1sxXSwgMTApICsgMiAqIHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyA9PSAnZnJvbXBvbHknKSB7XHJcbiAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7IGd4ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgZ3kgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGUgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPCBzeCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMSAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApIDwgc3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDAgJiYgcGFyc2VJbnQocGFydHNbaV0sIDEwKSA+IGd4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd4ID0gcGFyc2VJbnQocGFydHNbaV0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAxICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPiBneSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBneSA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBzeDsgcGFydHNbMV0gPSBzeTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gZ3g7IHBhcnRzWzNdID0gZ3k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEocGFyc2VJbnQocGFydHNbMV0sIDEwKSA+PSAwKSkgeyBwYXJ0c1sxXSA9IHBhcnRzWzBdOyB9XHJcbiAgICAgICAgICAgIGlmICghKHBhcnNlSW50KHBhcnRzWzJdLCAxMCkgPj0gMCkpIHsgcGFydHNbMl0gPSBwYXJzZUludChwYXJ0c1swXSwgMTApICsgMTA7IH1cclxuICAgICAgICAgICAgaWYgKCEocGFyc2VJbnQocGFydHNbM10sIDEwKSA+PSAwKSkgeyBwYXJ0c1szXSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgKyAxMDsgfVxyXG4gICAgICAgICAgICBpZiAocGFyc2VJbnQocGFydHNbMF0sIDEwKSA+IHBhcnNlSW50KHBhcnRzWzJdLCAxMCkpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgPSBwYXJ0c1swXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzBdID0gcGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IHRlbXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgPiBwYXJzZUludChwYXJ0c1szXSwgMTApKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnRzWzNdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbM10gPSB0ZW1wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvb3JkcyA9IHBhcnRzWzBdICsgXCIsXCIgKyBwYXJ0c1sxXSArIFwiLFwiICsgcGFydHNbMl0gKyBcIixcIiArIHBhcnRzWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICBpZiAoZmxhZyA9PSAnZnJvbXJlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7IGd4ID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgZ3kgPSBwYXJzZUludChwYXJ0c1szXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgLy91c2Ugc21hbGxlciBzaWRlXHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IChneCAtIHN4IDwgZ3kgLSBzeSkgPyBneCAtIHN4IDogZ3kgLSBzeTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gTWF0aC5mbG9vcihwYXJ0c1syXSAvIDIpOyAvL3JhZGl1c1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBzeCArIHBhcnRzWzJdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMV0gPSBzeSArIHBhcnRzWzJdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZsYWcgPT0gJ2Zyb21wb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgc3ggPSBwYXJzZUludChwYXJ0c1swXSwgMTApOyBneCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBzeSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7IGd5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlID0gcGFydHMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApIDwgc3gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ggPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDEgJiYgcGFyc2VJbnQocGFydHNbaV0sIDEwKSA8IHN5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbaV0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPiBneCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBneCA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMSAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApID4gZ3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3kgPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vdXNlIHNtYWxsZXIgc2lkZVxyXG4gICAgICAgICAgICAgICAgcGFydHNbMl0gPSAoZ3ggLSBzeCA8IGd5IC0gc3kpID8gZ3ggLSBzeCA6IGd5IC0gc3k7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IE1hdGguZmxvb3IocGFydHNbMl0gLyAyKTsgLy9yYWRpdXNcclxuICAgICAgICAgICAgICAgIHBhcnRzWzBdID0gc3ggKyBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzFdID0gc3kgKyBwYXJ0c1syXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIShwYXJzZUludChwYXJ0c1sxXSwgMTApID4gMCkpIHsgcGFydHNbMV0gPSBwYXJ0c1swXTsgfVxyXG4gICAgICAgICAgICBpZiAoIShwYXJzZUludChwYXJ0c1syXSwgMTApID4gMCkpIHsgcGFydHNbMl0gPSAxMDsgfVxyXG4gICAgICAgICAgICBjb29yZHMgPSBwYXJ0c1swXSArIFwiLFwiICsgcGFydHNbMV0gKyBcIixcIiArIHBhcnRzWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgaWYgKGZsYWcgPT0gJ2Zyb21yZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgcGFydHNbNF0gPSBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzVdID0gcGFydHNbM107XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzBdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbNl0gPSBwYXJ0c1s0XTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzddID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyA9PSAnZnJvbWNpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIC8vIEAgdXJsIGh0dHA6Ly93d3cucGl4ZWx3aXQuY29tL2Jsb2cvMjAwNy8wNi8yOS9iYXNpYy1jaXJjbGUtZHJhd2luZy1hY3Rpb25zY3JpcHQvXHJcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyWCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyWSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcnRzW2orK10gPSBjZW50ZXJYICsgcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbaisrXSA9IGNlbnRlclk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2lkZXMgPSA2MDsgLy9jb25zdGFudCA9IHNpZGVzIHRoZSBmYWtlIGNpcmNsZSB3aWxsIGhhdmVcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gc2lkZXM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFJhdGlvID0gaSAvIHNpZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB4U3RlcHMgPSBNYXRoLmNvcyhwb2ludFJhdGlvICogMiAqIE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB5U3RlcHMgPSBNYXRoLnNpbihwb2ludFJhdGlvICogMiAqIE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFggPSBjZW50ZXJYICsgeFN0ZXBzICogcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFkgPSBjZW50ZXJZICsgeVN0ZXBzICogcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzW2orK10gPSBNYXRoLnJvdW5kKHBvaW50WCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHNbaisrXSA9IE1hdGgucm91bmQocG9pbnRZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb29yZHMgPSBwYXJ0cy5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxhZyA9PSAncHJlc2VydmUnICYmIG9sZGNvb3JkcyAhPSBjb29yZHMpIHtcclxuICAgICAgICAgICAgLy9yZXR1cm4gb3JpZ2luYWwgYW5kIHRocm93IGVycm9yXHJcbiAgICAgICAgICAgIC8vdGhyb3cgXCJpbnZhbGlkIGNvb3Jkc1wiO1xyXG4gICAgICAgICAgICByZXR1cm4gb2xkY29vcmRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29vcmRzO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlx0U2V0cyB0aGUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBKU09OIG1hcCBjb2RlIG9yIERPTSBvYmplY3QuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi0wNi0wNyAxMTo0NzoxNlxyXG4gICAgKlx0QHBhcmFtXHRtYXBcdERPTSBvYmplY3Qgb3Igc3RyaW5nIG9mIGEgbWFwIHlvdSB3YW50IHRvIGFwcGx5LlxyXG4gICAgKlx0QHJldHVyblx0VHJ1ZSBvbiBzdWNjZXNzXHJcbiAgICAqL1xyXG4gICAgc2V0TWFwSnNvbiA9IGZ1bmN0aW9uIChtYXA6IElJbWFnZU1hcERhdGEpIHtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25TZXRNYXAnLCBtYXApO1xyXG5cclxuICAgICAgICAvL3JlbW92ZSBhbGwgYXJlYXNcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbEFyZWFzKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFwbmFtZSA9IG1hcC5uYW1lO1xyXG4gICAgICAgIHRoaXMubWFwaWQgPSBtYXAuaWQ7XHJcbiAgICAgICAgdmFyIHNoYXBlLCBjb29yZHMsIGhyZWYsIGFsdCwgdGl0bGUsIHRhcmdldCwgaWQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gbWFwLmFyZWFzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgc2hhcGUgPSBjb29yZHMgPSBocmVmID0gYWx0ID0gdGl0bGUgPSB0YXJnZXQgPSAnJztcclxuXHJcbiAgICAgICAgICAgIGlkID0gdGhpcy5hZGROZXdBcmVhKCk7IC8vYnR3IGlkID09IHRoaXMuY3VycmVudGlkLCBqdXN0IHRoaXMgZm9ybSBpcyBhIGJpdCBjbGVhcmVyXHJcblxyXG4gICAgICAgICAgICBzaGFwZSA9IHRoaXMuX25vcm1TaGFwZShtYXAuYXJlYXNbaV0uc2hhcGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0QXJlYShpZCwgc2hhcGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcC5hcmVhc1tpXS5jb29yZHMpIHtcclxuICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplIGNvb3Jkc1xyXG4gICAgICAgICAgICAgICAgY29vcmRzID0gdGhpcy5fbm9ybUNvb3JkcyhtYXAuYXJlYXNbaV0uY29vcmRzLCBzaGFwZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5sYXN0SW5wdXQgPSBjb29yZHM7XHJcbiAgICAgICAgICAgICAgICAvL2ZvciBhcmVhIHRoaXMgb25lIHdpbGwgYmUgc2V0IGluIHJlY2FsY3VsYXRlXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGhyZWYgPSBtYXAuYXJlYXNbaV0uaHJlZjtcclxuICAgICAgICAgICAgaWYgKGhyZWYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmFocmVmID0gaHJlZjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWx0ID0gbWFwLmFyZWFzW2ldLmFsdDtcclxuICAgICAgICAgICAgaWYgKGFsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0uYWFsdCA9IGFsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGFyZ2V0ID0gbWFwLmFyZWFzW2ldLnRhcmdldDtcclxuICAgICAgICAgICAgaWYgKHRhcmdldCkgeyB0YXJnZXQgPSB0YXJnZXQudG9Mb3dlckNhc2UoKTsgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0uYXRhcmdldCA9IHRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlKGlkLCBjb29yZHMpOyAvL2NvbnRhaW5zIHJlcGFpbnRcclxuICAgICAgICAgICAgdGhpcy5yZWxheEFyZWEoaWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uQXJlYUNoYW5nZWQnLCB0aGlzLmFyZWFzW2lkXSk7XHJcblxyXG4gICAgICAgIH0gLy9lbmQgZm9yIGFyZWFzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRBZGRzIGEgbmV3IGFyZWEuIEl0IHdpbGwgbGF0ZXIgYmVjb21lIGEgY2FudmFzLlxyXG4gICAgKlx0R1VJIHNob3VsZCB1c2UgdGhlIG9uQWRkQXJlYSBjYWxsYmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi0wNi0wNiAxNjo0OToyNVxyXG4gICAgKlx0QHNlZVx0I2luaXRBcmVhXHJcbiAgICAqL1xyXG4gICAgYWRkTmV3QXJlYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgbGFzdGFyZWEgPSB0aGlzLl9nZXRMYXN0QXJlYSgpO1xyXG4gICAgICAgIHZhciBpZCA9IChsYXN0YXJlYSkgPyBsYXN0YXJlYS5haWQgKyAxIDogMDtcclxuXHJcbiAgICAgICAgLy9pbnNlcnQgbmV3IHBvc3NpYmx5PyB1bmtub3duIGFyZWEgKHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXQgbW91c2Vkb3duKVxyXG4gICAgICAgIHZhciBhcmVhOiBhbnkgPSB0aGlzLmFyZWFzW2lkXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIGFyZWEuaWQgPSB0aGlzLm1hcG5hbWUgKyAnYXJlYScgKyBpZDtcclxuICAgICAgICBhcmVhLmFpZCA9IGlkO1xyXG4gICAgICAgIGFyZWEuc2hhcGUgPSBcInVuZGVmaW5lZFwiO1xyXG5cclxuICAgICAgICB0aGlzLmJsdXJBcmVhKHRoaXMuY3VycmVudGlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50aWQgPSBpZDtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEluaXRpYWxpemUgYSBuZXcgYXJlYS5cclxuICAgICpcdENyZWF0ZSB0aGUgY2FudmFzLCBpbml0aWFsaXplIGl0LlxyXG4gICAgKlx0UmVzZXQgYXJlYSBwYXJhbWV0ZXJzLlxyXG4gICAgKlx0QHBhcmFtXHRpZFx0VGhlIGlkIG9mIHRoZSBhcmVhIChhbHJlYWR5IGV4aXN0aW5nIHdpdGggdW5kZWZpbmVkIHNoYXBlKVxyXG4gICAgKlx0QHBhcmFtXHRzaGFwZVx0VGhlIHNoYXBlIHRoZSBhcmVhIHdpbGwgaGF2ZSAocmVjdCwgY2lyY2xlLCBwb2x5KVxyXG4gICAgKi9cclxuICAgIGluaXRBcmVhID0gZnVuY3Rpb24gKGlkLCBzaGFwZSkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhKSB7IHJldHVybjsgfSAvL2lmIGFsbCB3YXMgZXJhc2VkLCByZXR1cm5cclxuICAgICAgICAvL3JlbW92ZSBwcmVpbml0ZWQgZHVtbXkgZGl2IG9yIGFscmVhZHkgcGxhY2VkIGNhbnZhc1xyXG4gICAgICAgIGlmIChhcmVhLnBhcmVudE5vZGUpIHsgYXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFyZWEpOyB9XHJcbiAgICAgICAgaWYgKGFyZWEubGFiZWwpIHsgYXJlYS5sYWJlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFyZWEubGFiZWwpOyB9XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIENBTlZBUyBub2RlXHJcbiAgICAgICAgYXJlYSA9IHRoaXMuYXJlYXNbaWRdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQ0FOVkFTJyk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LmFwcGVuZENoaWxkKGFyZWEpO1xyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgICAgICAgLy8gaWYgKHR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXIgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIC8vICAgICAvL292ZXJyaWRlIENBTlZBUyB3aXRoIFZNTCBvYmplY3RcclxuICAgICAgICAvLyAgICAgYXJlYSA9IHRoaXMuYXJlYXNbaWRdID0gR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGFyZWEpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBhcmVhLmlkID0gdGhpcy5tYXBuYW1lICsgJ2FyZWEnICsgaWQ7XHJcbiAgICAgICAgYXJlYS5haWQgPSBpZDtcclxuICAgICAgICBhcmVhLnNoYXBlID0gc2hhcGU7XHJcbiAgICAgICAgYXJlYS5haHJlZiA9ICcnO1xyXG4gICAgICAgIGFyZWEuYXRpdGxlID0gJyc7XHJcbiAgICAgICAgYXJlYS5hYWx0ID0gJyc7XHJcbiAgICAgICAgYXJlYS5hdGFyZ2V0ID0gJyc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRUb3AgKyAncHgnO1xyXG4gICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuX3NldG9wYWNpdHkoYXJlYSwgdGhpcy5jb25maWcuQ0xfRFJBV19CRywgdGhpcy5jb25maWcuZHJhd19vcGFjaXR5KTtcclxuICAgICAgICAvL2hvb2sgZXZlbnQgaGFuZGxlcnNcclxuXHJcbiAgICAgICAgYXJlYS5vbm1vdXNlZG93biA9IHRoaXMuYXJlYV9tb3VzZWRvd24uYmluZCh0aGlzKTtcclxuICAgICAgICBhcmVhLm9ubW91c2V1cCA9IHRoaXMuYXJlYV9tb3VzZXVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgYXJlYS5vbm1vdXNlbW92ZSA9IHRoaXMuYXJlYV9tb3VzZW1vdmUuYmluZCh0aGlzKTtcclxuICAgICAgICBhcmVhLm9ubW91c2VvdmVyID0gdGhpcy5hcmVhX21vdXNlb3Zlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGFyZWEub25tb3VzZW91dCA9IHRoaXMuYXJlYV9tb3VzZW91dC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vaW5pdGlhbGl6ZSBtZW1vcnkgb2JqZWN0XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdID0ge307XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdLmRvd254ID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0uZG93bnkgPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS5sZWZ0ID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0udG9wID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS54cG9pbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdLnlwb2ludHMgPSBbXTtcclxuICAgICAgICAvL2NyZWF0ZSBsYWJlbCBub2RlXHJcbiAgICAgICAgYXJlYS5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LmFwcGVuZENoaWxkKGFyZWEubGFiZWwpO1xyXG4gICAgICAgIGFyZWEubGFiZWwuY2xhc3NOYW1lID0gdGhpcy5jb25maWcubGFiZWxfY2xhc3M7XHJcbiAgICAgICAgdGhpcy5hc3NpZ25DU1MoYXJlYS5sYWJlbCwgdGhpcy5jb25maWcubGFiZWxfc3R5bGUpO1xyXG4gICAgICAgIGFyZWEubGFiZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG5cclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25BZGRBcmVhJywgaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRSZXNldHMgYXJlYSBib3JkZXIgYW5kIG9wYWNpdHkgdG8gYSBub3JtYWwgc3RhdGUgYWZ0ZXIgZHJhd2luZy5cclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBkYXRlXHQxNS0wMi0yMDA3IDIyOjA3OjI4XHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEuXHJcblxyXG4gICAgKi9cclxuICAgIHJlbGF4QXJlYSA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBpZiAoaWQgIT0gdGhpcy5jdXJyZW50aWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0Qm9yZGVyKGFyZWEsICdOT1JNJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldG9wYWNpdHkoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9CRywgdGhpcy5jb25maWcubm9ybV9vcGFjaXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEFyZWEoaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTZXQgYm9yZGVyIG9mIGEgZ2l2ZW4gYXJlYSBhY2NvcmRpbmcgdG8gc3R5bGUgZmxhZy5cclxuICAgICpcdFBvc3NpYmxlIHZhbHVlcyBvZiBzdHlsZTogTk9STSwgSElHSExJR0hULCBEUkFXLlxyXG4gICAgKlx0Tm9uLXJlY3RhbmdsZSBzaGFwZXMgd29udCBnZXQgYSBib3JkZXIgaWYgY29uZmlnLmJvdW5kaW5nX2JveCBpcyBmYWxzZS5cclxuICAgICpcdEBkYXRlXHQyNi0xMi0yMDA4IDIyOjM0OjQxXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gc2V0IHRoZSBib3JkZXIgb24uXHJcbiAgICAqXHRAcGFyYW1cdHN0eWxlXHRDb2xvcmluZyBzdHlsZSAoTk9STSwgSElHSExJR0hULCBEUkFXKSwgc2VlIHJlbGV2YW50IGNvbG9ycyBpbiBjb25maWcuXHJcbiAgICAqXHRAc2luY2VcdDIuMVxyXG4gICAgKi9cclxuICAgIF9zZXRCb3JkZXIgPSBmdW5jdGlvbiAoYXJlYSwgc3R5bGUpIHtcclxuICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcgfHwgdGhpcy5jb25maWcuYm91bmRpbmdfYm94KSB7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5ib3JkZXJTdHlsZSA9IChzdHlsZSA9PSAnRFJBVycgPyAnZG90dGVkJyA6ICdzb2xpZCcpO1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5jb25maWdbJ0NMXycgKyBzdHlsZSArICdfJyArIChhcmVhLnNoYXBlID09ICdyZWN0JyA/ICdTSEFQRScgOiAnQk9YJyldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9jbGVhciBib3JkZXJcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5ib3JkZXIgPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFNldCBvcGFjaXR5IG9mIGFyZWEgdG8gdGhlIGdpdmVuIHBlcmNlbnRhZ2UsIGFzIHdlbGwgYXMgc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgKlx0SWYgcGVyY2VudGFnZSBjb250YWlucyBhIGRhc2goLSksIHRoZSBzZXR0aW5nIG9mIHRoZSBvcGFjaXR5IHdpbGwgYmUgZ3JhZHVhbC5cclxuICAgICpcdEBwYXJhbVx0YXJlYVx0VGhlIGFyZWEgb2JqZWN0LlxyXG4gICAgKlx0QHBhcmFtXHRiZ2NvbG9yXHROZXcgYmFja2dyb3VuZCBjb2xvclxyXG4gICAgKlx0QHBhcmFtXHRwY3RcdFx0UGVyY2VudGFnZSBvZiB0aGUgb3BhY2l0eS5cclxuICAgICovXHJcbiAgICBfc2V0b3BhY2l0eSA9IGZ1bmN0aW9uIChhcmVhLCBiZ2NvbG9yLCBwY3QpIHtcclxuICAgICAgICBpZiAoYmdjb2xvcikgeyBhcmVhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJnY29sb3I7IH1cclxuICAgICAgICBpZiAocGN0ICYmIHR5cGVvZiBwY3QgPT0gJ3N0cmluZycgJiYgcGN0Lm1hdGNoKC9eXFxkKlxcLVxcZCskLykpIHtcclxuICAgICAgICAgICAgLy9ncmFkdWFsIGZhZGVcclxuICAgICAgICAgICAgdmFyIHBhcnRzOiBhbnkgPSBwY3Quc3BsaXQoJy0nKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0c1swXSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgaW5pdGlhbCBvcGFjaXR5XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1swXSA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIGJnY29sb3IsIHBhcnRzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnRzWzFdICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VyciA9IHRoaXMuX2dldG9wYWNpdHkoYXJlYSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5yb3VuZChwYXJ0c1sxXSAtIGN1cnIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPiA1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2V0b3BhY2l0eShhcmVhLCBudWxsLCAnLScgKyBwYXJ0c1sxXSk7IH0sIDIwKTtcclxuICAgICAgICAgICAgICAgICAgICBwY3QgPSAxICogY3VyciArIDU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkaWZmIDwgLTMpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IF90aGlzLl9zZXRvcGFjaXR5KGFyZWEsIG51bGwsICctJyArIHBhcnRzWzFdKTsgfSwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgIHBjdCA9IDEgKiBjdXJyIC0gMztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZmluYWwgc2V0XHJcbiAgICAgICAgICAgICAgICAgICAgcGN0ID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihwY3QpKSB7XHJcbiAgICAgICAgICAgIHBjdCA9IE1hdGgucm91bmQocGFyc2VJbnQocGN0LCAxMCkpO1xyXG5cclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5vcGFjaXR5ID0gcGN0IC8gMTAwO1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PScgKyBwY3QgKyAnKSc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHZXQgdGhlIGN1cnJlbnRseSBzZXQgb3BhY2l0eSBvZiBhIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIChjYW52YXMpIHlvdSB3YW50IHRvIGdldCBvcGFjaXR5IGluZm8gZnJvbS5cclxuICAgICpcdEByZXR1cm5cdE9wYWNpdHkgdmFsdWUgaW4gYSByYW5nZSBvZiAwLTEwMC5cclxuICAgICovXHJcbiAgICBfZ2V0b3BhY2l0eSA9IGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgaWYgKGFyZWEuc3R5bGUub3BhY2l0eSA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmVhLnN0eWxlLm9wYWNpdHkgKiAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcmVhLnN0eWxlLmZpbHRlcikge1xyXG4gICAgICAgICAgICAvL2FscGhhKG9wYWNpdHk9TmFOKVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoYXJlYS5zdHlsZS5maWx0ZXIucmVwbGFjZSgvYWxwaGFcXChvcGFjaXR5XFw9KFteXFwpXSopXFwpL2lnLCBcIiQxXCIpLCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAxMDA7IC8vZGVmYXVsdCBvcGFjaXR5XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFJlbW92ZXMgdGhlIGFyZWEgbWFya2VkIGJ5IGlkLlxyXG4gICAgKlx0Q2FsbGJhY2sgd2lsbCBjYWxsIHRoZSBHVUkgY29kZSB0byByZW1vdmUgR1VJIGVsZW1lbnRzLlxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QGRhdGVcdDExLTAyLTIwMDcgMjA6NDA6NThcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byByZW1vdmUuXHJcbiAgICAqXHRAc2VlXHQjcmVtb3ZlQWxsQXJlYXNcclxuICAgICovXHJcbiAgICByZW1vdmVBcmVhID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IHR5cGVvZiBpZCA9PSBcInVuZGVmaW5lZFwiKSB7IHJldHVybjsgfSAvL2V4aXQgaWYgbm8gaWQgZ2l2ZW5cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9yZW1vdmUgYXJlYSBhbmQgbGFiZWxcclxuICAgICAgICAgICAgLy9leHBsaWNpdGx5IHNldCBzb21lIHZhbHVlcyB0byBudWxsIHRvIGF2b2lkIElFIGNpcmN1bGFyIHJlZmVyZW5jZSBtZW1sZWFrXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmxhYmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hcmVhc1tpZF0ubGFiZWwpO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYXJlYXNbaWRdKTtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ubGFiZWwuY2xhc3NOYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmxhYmVsID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZW92ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5vbm1vdXNlb3V0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZWRvd24gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5vbm1vdXNlbW92ZSA9IG51bGw7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXJlYXNbaWRdID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZW1vdmVBcmVhJywgaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRSZW1vdmVzIGFsbCBhcmVhcy5cclxuICAgICpcdFdpbGwgY2FsbCByZW1vdmVBcmVhIG9uIGFsbCBhcmVhcy5cclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBkYXRlXHQyMDA2LTA2LTA3IDExOjU1OjM0XHJcbiAgICAqXHRAc2VlXHQjcmVtb3ZlQXJlYVxyXG4gICAgKi9cclxuICAgIHJlbW92ZUFsbEFyZWFzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHRoaXMuYXJlYXMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBcmVhKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTY2FsZXMgYWxsIGFyZWFzLlxyXG4gICAgKlx0V2lsbCBzdG9yZSBzY2FsZSBwYXJhbWV0ZXIgaW4gZ2xvYmFsc2NhbGUgcHJvcGVydHkuXHJcbiAgICAqXHRUaGlzIGlzIG5lZWRlZCB0byBrbm93IGhvdyB0byBkcmF3IG5ldyBhcmVhcyBvbiBhbiBhbHJlYWR5IHNjYWxlZCBjYW52YXMuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAZGF0ZVx0MDItMTEtMjAwOCAxNDoxMzoxNFxyXG4gICAgKlx0QHBhcmFtIHNjYWxlXHRTY2FsZSBmYWN0b3IgKDEtb3JpZ2luYWwsIDAuNS1oYWxmLCAyLWRvdWJsZSwgZXRjLilcclxuICAgICovXHJcbiAgICBzY2FsZUFsbEFyZWFzID0gZnVuY3Rpb24gKHNjYWxlKSB7XHJcbiAgICAgICAgdmFyIHJzY2FsZSA9IHNjYWxlIC8gdGhpcy5nbG9iYWxzY2FsZTsgLy9yZWxhdGl2ZSBzY2FsZVxyXG4gICAgICAgIHRoaXMuZ2xvYmFsc2NhbGUgPSBzY2FsZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGUgPSB0aGlzLmFyZWFzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbaV0gJiYgdGhpcy5hcmVhc1tpXS5zaGFwZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZUFyZWEoaSwgcnNjYWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0U2NhbGVzIG9uZSBhcmVhLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QGRhdGVcdDAyLTExLTIwMDggMTQ6MTM6MTRcclxuICAgICpcdEBwYXJhbSByc2NhbGVcdFJlbGF0aXZlIHNjYWxlIGZhY3RvciAoMS1rZWVwLCAwLjUtaGFsZiwgMi1kb3VibGUsIGV0Yy4pXHJcbiAgICAqL1xyXG4gICAgc2NhbGVBcmVhID0gZnVuY3Rpb24gKGlkLCByc2NhbGUpIHtcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uIGFuZCBuZXcgZGltZW5zaW9uc1xyXG4gICAgICAgIGFyZWEuc3R5bGUudG9wID0gcGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSAqIHJzY2FsZSArICdweCc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gcGFyc2VJbnQoYXJlYS5zdHlsZS5sZWZ0LCAxMCkgKiByc2NhbGUgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2V0QXJlYVNpemUoaWQsIGFyZWEud2lkdGggKiByc2NhbGUsIGFyZWEuaGVpZ2h0ICogcnNjYWxlKTtcclxuXHJcbiAgICAgICAgLy9oYW5kbGUgcG9seWdvbiBjb29yZGluYXRlcyBzY2FsaW5nXHJcbiAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ3BvbHknKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IGFyZWEueHBvaW50cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbaV0gKj0gcnNjYWxlO1xyXG4gICAgICAgICAgICAgICAgYXJlYS55cG9pbnRzW2ldICo9IHJzY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVjb29yZHMoaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRQdXQgbGFiZWwgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciBhY2NvcmRpbmcgdG8gbGFiZWwgY29uZmlnLlxyXG4gICAgKlx0QnkgZGVmYXVsdCBpdCB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB0aGUgYXJlYSAoYXJlYS5haWQpXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gYWRkIGxhYmVsIHRvLlxyXG4gICAgKi9cclxuICAgIF9wdXRsYWJlbCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhLmxhYmVsKSB7IHJldHVybjsgfSAvL25vdCB5ZXQgaW5pdGVkXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5sYWJlbC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5jb25maWcubGFiZWw7XHJcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnJlcGxhY2UoLyVuL2csIFN0cmluZyhpZCkpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5yZXBsYWNlKC8lYy9nLCBTdHJpbmcoYXJlYS5sYXN0SW5wdXQpKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSgvJWgvZywgU3RyaW5nKGFyZWEuYWhyZWYpKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSgvJWEvZywgU3RyaW5nKGFyZWEuYWFsdCkpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5yZXBsYWNlKC8ldC9nLCBTdHJpbmcoYXJlYS5hdGl0bGUpKTtcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuaW5uZXJIVE1MID0gbGFiZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9hbGlnbiB0byB0aGUgdG9wIGxlZnQgY29ybmVyXHJcbiAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUudG9wID0gYXJlYS5zdHlsZS50b3A7XHJcbiAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUubGVmdCA9IGFyZWEuc3R5bGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyhcIkVycm9yIHB1dHRpbmcgbGFiZWxcIiwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTZXQgYXJlYSB0aXRsZSBhbmQgYWx0IChmb3IgSUUpIGFjY29yZGluZyB0byB0aGUgaGludCBjb25maWd1cmF0aW9uLlxyXG4gICAgKlx0VGhpcyB3aWxsIHNob3cgdXAgaW4gdGhlIHVzdWFsIHllbGxvdyBib3ggd2hlbiB5b3UgaG92ZXIgb3ZlciB3aXRoIHRoZSBtb3VzZS5cclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byBzZXQgaGludCBhdC5cclxuICAgICovXHJcbiAgICBfcHV0aGludCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcuaGludCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0udGl0bGUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmFsdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhpbnQgPSB0aGlzLmNvbmZpZy5oaW50O1xyXG4gICAgICAgICAgICAgICAgaGludCA9IGhpbnQucmVwbGFjZSgvJW4vZywgU3RyaW5nKGlkKSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8lYy9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0ubGFzdElucHV0KSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8laC9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0uYWhyZWYpKTtcclxuICAgICAgICAgICAgICAgIGhpbnQgPSBoaW50LnJlcGxhY2UoLyVhL2csIFN0cmluZyh0aGlzLmFyZWFzW2lkXS5hYWx0KSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8ldC9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0uYXRpdGxlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS50aXRsZSA9IGhpbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5hbHQgPSBoaW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2coXCJFcnJvciBwdXR0aW5nIGhpbnRcIiwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRXaWxsIGNhbGwgcmVwYWludCBvbiBhbGwgYXJlYXMuXHJcbiAgICAqXHRVc2VmdWwgd2hlbiB5b3UgY2hhbmdlIGxhYmVsaW5nIG9yIGhpbnQgY29uZmlnIG9uIHRoZSBHVUkuXHJcbiAgICAqXHRAc2VlICNfcmVwYWludFxyXG4gICAgKi9cclxuICAgIF9yZXBhaW50QWxsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHRoaXMuYXJlYXMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwYWludCh0aGlzLmFyZWFzW2ldLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0UmVwYWludHMgdGhlIGFjdHVhbCBjYW52YXMgY29udGVudC5cclxuICAgICpcdFRoaXMgaXMgdGhlIG9ubHkgY2FudmFzIGRyYXdpbmcgbWFnaWMgdGhhdCBpcyBoYXBwZW5pbmcuXHJcbiAgICAqXHRJbiBmYWN0IHJlY3RhbmdsZXMgd2lsbCBub3QgaGF2ZSBhbnkgY2FudmFzIGNvbnRlbnQsIGp1c3QgYSBub3JtYWwgY3NzIGJvcmRlci5cclxuICAgICpcdEFmdGVyIHJlcGFpbnRpbmcgdGhlIGNhbnZhcywgaXQgd2lsbCBjYWxsIHB1dGxhYmVsIGFuZCBwdXRoaW50IG1ldGhvZHMuXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIG9iamVjdC5cclxuICAgICpcdEBwYXJhbVx0Y29sb3JcdENvbG9yIG9mIHRoZSBsaW5lIHRvIGRyYXcgb24gdGhlIGNhbnZhcy5cclxuICAgICpcdEBwYXJhbVx0eFx0T25seSB1c2VkIGZvciBwb2x5Z29ucyBhcyB0aGUgbmV3ZXN0IGNvbnRyb2wgcG9pbnQgeC5cclxuICAgICpcdEBwYXJhbVx0eVx0T25seSB1c2VkIGZvciBwb2x5Z29ucyBhcyB0aGUgbmV3ZXN0IGNvbnRyb2wgcG9pbnQgeS5cclxuICAgICovXHJcbiAgICBfcmVwYWludCA9IGZ1bmN0aW9uIChhcmVhLCBjb2xvciwgeCwgeSkge1xyXG4gICAgICAgIHZhciBjdHg7IC8vY2FudmFzIGNvbnRleHRcclxuICAgICAgICB2YXIgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wOyAvL2NhbnZhcyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdmFyIGksIGxlOyAvL2xvb3AgY291bnRlclxyXG4gICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApO1xyXG4gICAgICAgICAgICB2YXIgcmFkaXVzID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpIC0gMTtcclxuICAgICAgICAgICAgaWYgKHJhZGl1cyA8IDApXHJcbiAgICAgICAgICAgICAgICByYWRpdXMgPSAwO1xyXG5cclxuICAgICAgICAgICAgLy9nZXQgY2FudmFzIGNvbnRleHRcclxuICAgICAgICAgICAgY3R4ID0gYXJlYS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIC8vY2xlYXIgY2FudmFzXHJcbiAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIHdpZHRoKTtcclxuICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xyXG4gICAgICAgICAgICBjdHguYXJjKHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCAwKTtcclxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIC8vZHJhdyBjZW50ZXJcclxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb25maWcuQ0xfS05PQjtcclxuICAgICAgICAgICAgY3R4LnN0cm9rZVJlY3QocmFkaXVzLCByYWRpdXMsIDEsIDEpO1xyXG4gICAgICAgICAgICAvL3B1dCBsYWJlbFxyXG4gICAgICAgICAgICB0aGlzLl9wdXRsYWJlbChhcmVhLmFpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1dGhpbnQoYXJlYS5haWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAvL3B1dCBsYWJlbFxyXG4gICAgICAgICAgICB0aGlzLl9wdXRsYWJlbChhcmVhLmFpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1dGhpbnQoYXJlYS5haWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKTtcclxuICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApO1xyXG4gICAgICAgICAgICB0b3AgPSBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApO1xyXG4gICAgICAgICAgICBpZiAoYXJlYS54cG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjYW52YXMgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgY3R4ID0gYXJlYS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICAvL2NsZWFyIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBwb2x5Z29uXHJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYXJlYS54cG9pbnRzWzBdIC0gbGVmdCwgYXJlYS55cG9pbnRzWzBdIC0gdG9wKTtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKGFyZWEueHBvaW50c1tpXSAtIGxlZnQsIGFyZWEueXBvaW50c1tpXSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXIHx8IHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL29ubHkgZHJhdyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpZiBub3QgbW92aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0gbGVmdCwgeSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGFyZWEueHBvaW50c1swXSAtIGxlZnQsIGFyZWEueXBvaW50c1swXSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9wdXQgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5fcHV0bGFiZWwoYXJlYS5haWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9wdXRoaW50KGFyZWEuYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFVwZGF0ZXMgQXJlYSBjb29yZGluYXRlcy5cclxuICAgICpcdENhbGxlZCB3aGVuIG5lZWRlZCwgZWcuIG9uIG1vdXNlbW92ZSwgbW91c2Vkb3duLlxyXG4gICAgKlx0QWxzbyB1cGRhdGVzIGh0bWwgY29udGFpbmVyIHZhbHVlICh0aHJ1IGhvb2spLlxyXG4gICAgKlx0Q2FsbHMgY2FsbGJhY2sgb25BcmVhQ2hhbmdlZCBzbyB0aGF0IEdVSSBjYW4gZm9sbG93LlxyXG4gICAgKlx0VGhpcyBpcyBhbiBpbXBvcnRhbnQgaG9vayB0byB5b3VyIEdVSS5cclxuICAgICpcdFVzZXMgZ2xvYmFsc2NhbGUgdG8gc2NhbGUgcmVhbCBjb29yZGluYXRlcyB0byBhcmVhIGNvb3JkaW5hdGVzLlxyXG4gICAgKlx0QGRhdGVcdDIwMDYuMTAuMjQuIDIyOjM5OjI3XHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEuXHJcbiAgICAqL1xyXG4gICAgX3VwZGF0ZWNvb3JkcyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApIC8gdGhpcy5nbG9iYWxzY2FsZSk7XHJcbiAgICAgICAgdmFyIHRvcCA9IE1hdGgucm91bmQocGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSAvIHRoaXMuZ2xvYmFsc2NhbGUpO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUuaGVpZ2h0LCAxMCkgLyB0aGlzLmdsb2JhbHNjYWxlKTtcclxuICAgICAgICB2YXIgd2lkdGggPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKSAvIHRoaXMuZ2xvYmFsc2NhbGUpO1xyXG5cclxuICAgICAgICB2YXIgdmFsdWUgPSAnJztcclxuICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBsZWZ0ICsgJywnICsgdG9wICsgJywnICsgKGxlZnQgKyB3aWR0aCkgKyAnLCcgKyAodG9wICsgaGVpZ2h0KTtcclxuICAgICAgICAgICAgYXJlYS5sYXN0SW5wdXQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICB2YXIgcmFkaXVzID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpIC0gMTtcclxuICAgICAgICAgICAgdmFsdWUgPSAobGVmdCArIHJhZGl1cykgKyAnLCcgKyAodG9wICsgcmFkaXVzKSArICcsJyArIHJhZGl1cztcclxuICAgICAgICAgICAgYXJlYS5sYXN0SW5wdXQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgaWYgKGFyZWEueHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBNYXRoLnJvdW5kKGFyZWEueHBvaW50c1tpXSAvIHRoaXMuZ2xvYmFsc2NhbGUpICsgJywnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChhcmVhLnlwb2ludHNbaV0gLyB0aGlzLmdsb2JhbHNjYWxlKSArICcsJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFyZWEubGFzdElucHV0ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25BcmVhQ2hhbmdlZCcsIGFyZWEpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRVcGRhdGVzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZWEgd2l0aCB0aGUgZ2l2ZW4gaWQgYWNjb3JkaW5nXHJcbiAgICAqXHR0byB0aGUgbmV3IGNvb3JkaW5hdGVzIHRoYXQgdHlwaWNhbGx5IGNvbWUgZnJvbSBhbiBpbnB1dCBvbiB0aGUgR1VJLlxyXG4gICAgKlx0VXNlcyBnbG9iYWxzY2FsZSB0byBzY2FsZSBhcmVhIGNvb3JkaW5hdGVzIHRvIHJlYWwgY29vcmRpbmF0ZXMuXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi4xMC4yNC4gMjI6NDY6NTVcclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYS5cclxuICAgICpcdEBwYXJhbVx0Y29vcmRzXHRUaGUgbmV3IGNvb3JkcywgdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQuXHJcbiAgICAqL1xyXG4gICAgX3JlY2FsY3VsYXRlID0gZnVuY3Rpb24gKGlkLCBjb29yZHMpIHtcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChjb29yZHMpIHtcclxuICAgICAgICAgICAgICAgIGNvb3JkcyA9IHRoaXMuX25vcm1Db29yZHMoY29vcmRzLCBhcmVhLnNoYXBlLCAncHJlc2VydmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvb3JkcyA9IGFyZWEubGFzdElucHV0IHx8ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFydHMgPSBjb29yZHMuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQgfHxcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1swXSwgMTApID4gcGFyc2VJbnQocGFydHNbMl0sIDEwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgPiBwYXJzZUludChwYXJ0c1szXSwgMTApKSB7IHRocm93IFwiaW52YWxpZCBjb29yZHNcIjsgfVxyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gdGhpcy5nbG9iYWxzY2FsZSAqICh0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQocGFydHNbMF0sIDEwKSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUoaWQsIHRoaXMuZ2xvYmFsc2NhbGUgKiAocGFydHNbMl0gLSBwYXJ0c1swXSksIHRoaXMuZ2xvYmFsc2NhbGUgKiAocGFydHNbM10gLSBwYXJ0c1sxXSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDMgfHxcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1syXSwgMTApIDwgMCkgeyB0aHJvdyBcImludmFsaWQgY29vcmRzXCI7IH1cclxuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IDIgKiAocGFydHNbMl0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZShpZCwgdGhpcy5nbG9iYWxzY2FsZSAqIHdpZHRoLCB0aGlzLmdsb2JhbHNjYWxlICogd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gdGhpcy5nbG9iYWxzY2FsZSAqICh0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQocGFydHNbMF0sIDEwKSAtIHdpZHRoIC8gMikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSB3aWR0aCAvIDIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9TSEFQRSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7IHRocm93IFwiaW52YWxpZCBjb29yZHNcIjsgfVxyXG4gICAgICAgICAgICAgICAgYXJlYS54cG9pbnRzID0gW107XHJcbiAgICAgICAgICAgICAgICBhcmVhLnlwb2ludHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHBhcnRzLmxlbmd0aDsgaSA8IGxlOyBpICs9IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbYXJlYS54cG9pbnRzLmxlbmd0aF0gPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQgKyBwYXJzZUludChwYXJ0c1tpXSwgMTApKTtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnlwb2ludHNbYXJlYS55cG9pbnRzLmxlbmd0aF0gPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzW2kgKyAxXSwgMTApKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb2x5Z29uZ3JvdyhhcmVhLCB0aGlzLmdsb2JhbHNjYWxlICogcGFydHNbaV0sIHRoaXMuZ2xvYmFsc2NhbGUgKiBwYXJ0c1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seWdvbnNocmluayhhcmVhKTsgLy9pbmNsdWRlcyByZXBhaW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB2YXIgbXNnID0gKGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ2Vycm9yIGNhbGN1bGF0aW5nIGNvb3JkaW5hdGVzJztcclxuICAgICAgICAgICAgdGhpcy5sb2cobXNnLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5FUlJfSU5WQUxJRF9DT09SRFMpO1xyXG4gICAgICAgICAgICBpZiAoYXJlYS5sYXN0SW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvbkFyZWFDaGFuZ2VkJywgYXJlYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL29uIHN1Y2Nlc3MgdXBkYXRlIGxhc3RJbnB1dFxyXG4gICAgICAgIGFyZWEubGFzdElucHV0ID0gY29vcmRzO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHcm93IHBvbHlnb24gYXJlYSB0byBiZSBhYmxlIHRvIGNvbnRhaW4gdGhlIGdpdmVuIG5ldyBjb29yZGluYXRlcy5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0YXJlYVx0VGhlIGFyZWEgdG8gZ3Jvdy5cclxuICAgICpcdEBwYXJhbVx0bmV3eFx0VGhlIG5ldyBjb29yZGluYXRlIHguXHJcbiAgICAqXHRAcGFyYW1cdG5ld3lcdFRoZSBuZXcgY29vcmRpbmF0ZSB5LlxyXG4gICAgKlx0QHNlZVx0I19wb2x5Z29uc2hyaW5rXHJcbiAgICAqL1xyXG4gICAgX3BvbHlnb25ncm93ID0gZnVuY3Rpb24gKGFyZWEsIG5ld3gsIG5ld3kpIHtcclxuICAgICAgICB2YXIgeGRpZmYgPSBuZXd4IC0gcGFyc2VJbnQoYXJlYS5zdHlsZS5sZWZ0LCAxMCk7XHJcbiAgICAgICAgdmFyIHlkaWZmID0gbmV3eSAtIHBhcnNlSW50KGFyZWEuc3R5bGUudG9wLCAxMCk7XHJcbiAgICAgICAgdmFyIHBhZCA9IDA7IC8vcGFkZGluZyBvbiB0aGUgZWRnZXNcclxuICAgICAgICB2YXIgcGFkMiA9IDA7IC8vdHdpY2UgdGhlIHBhZGRpbmdcclxuXHJcbiAgICAgICAgaWYgKG5ld3ggPCBwYXJzZUludChhcmVhLnN0eWxlLmxlZnQsIDEwKSkge1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAobmV3eCAtIHBhZCkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBwYXJzZUludChhcmVhLnN0eWxlLndpZHRoLCAxMCkgKyBNYXRoLmFicyh4ZGlmZikgKyBwYWQyLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobmV3eCA+IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApICsgcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUoYXJlYS5haWQsIG5ld3ggLSBwYXJzZUludChhcmVhLnN0eWxlLmxlZnQsIDEwKSArIHBhZDIsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3eSA8IHBhcnNlSW50KGFyZWEuc3R5bGUudG9wLCAxMCkpIHtcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSAobmV3eSAtIHBhZCkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBudWxsLCBwYXJzZUludChhcmVhLnN0eWxlLmhlaWdodCwgMTApICsgTWF0aC5hYnMoeWRpZmYpICsgcGFkMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5ld3kgPiBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApICsgcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBudWxsLCBuZXd5IC0gcGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSArIHBhZDIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0U2hyaW5rIHRoZSBwb2x5Z29uIGJvdW5kaW5nIGFyZWEgdG8gdGhlIG5lY2Vzc2FyeSBzaXplLCBieSBmaXJzdCByZWR1Y2luZyBpdFxyXG4gICAgKlx0dG8gdGhlIG1pbmltdW0sIGFuZCB0aGVuIGdyYWR1YWxseSBncm93aW5nIGl0LlxyXG4gICAgKlx0V2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2hpbGUgd2Ugd2VyZSBkcmF3aW5nIHRoZSBwb2x5Z29uLCBpdCBtaWdodCBoYXZlIGV4cGFuZGVkXHJcbiAgICAqXHR0aGUgY2FudmFzIG1vcmUgdGhhbiBuZWVkZWQuXHJcbiAgICAqXHRXaWxsIHJlcGFpbnQgdGhlIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIHRvIHNocmluay5cclxuICAgICpcdEBzZWVcdCNfcG9seWdvbmdyb3dcclxuICAgICovXHJcbiAgICBfcG9seWdvbnNocmluayA9IGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gKGFyZWEueHBvaW50c1swXSkgKyAncHgnO1xyXG4gICAgICAgIGFyZWEuc3R5bGUudG9wID0gKGFyZWEueXBvaW50c1swXSkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2V0QXJlYVNpemUoYXJlYS5haWQsIDAsIDApO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IGFyZWEueHBvaW50cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHlnb25ncm93KGFyZWEsIGFyZWEueHBvaW50c1tpXSwgYXJlYS55cG9pbnRzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBtb3VzZW1vdmUgb24gdGhlIGltYWdlLlxyXG4gICAgKlx0VGhpcyBpcyB0aGUgbWFpbiBkcmF3aW5nIHJvdXRpbmUuXHJcbiAgICAqXHREZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc2hhcGUsIHdpbGwgZHJhdyB0aGUgcmVjdC9jaXJjbGUvcG9seSB0byB0aGUgbmV3IHBvc2l0aW9uLlxyXG4gICAgKlx0QHBhcmFtXHRlXHRUaGUgZXZlbnQgb2JqZWN0LlxyXG4gICAgKi9cclxuICAgIGltZ19tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vZnVuY3Rpb24gbGV2ZWwgdmFyIGRlY2xhcmF0aW9uc1xyXG4gICAgICAgIHZhciB4ZGlmZixcclxuICAgICAgICAgICAgeWRpZmYsXHJcbiAgICAgICAgICAgIGRpZmY7XHJcblxyXG4gICAgICAgIC8vZXZlbnQueCBpcyByZWxhdGl2ZSB0byBwYXJlbnQgZWxlbWVudCwgYnV0IHBhZ2UueCBpcyBOT1RcclxuICAgICAgICAvL3BvcyBjb29yZGluYXRlcyBhcmUgdGhlIHNhbWUgYWJzb2x1dGUgY29vcmRzLCBvZmZzZXQgY29vcmRzIGFyZSByZWxhdGl2ZSB0byBwYXJlbnRcclxuICAgICAgICBjb25zdCB3aW5kb3dFdmVudDogYW55ID0gd2luZG93LmV2ZW50O1xyXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLl9nZXRQb3ModGhpcy5pbWFnZUVsZW1lbnQpLFxyXG4gICAgICAgICAgICB4ID0gKHRoaXMuaXNNU0lFKSA/ICh3aW5kb3dFdmVudC54ICsgdGhpcy5wYXJlbnRJbWFnZUVsZW1lbnQuc2Nyb2xsTGVmdCAtIHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQpIDogKGUuY2xpZW50WCAtIHBvcy54KSxcclxuICAgICAgICAgICAgeSA9ICh0aGlzLmlzTVNJRSkgPyAod2luZG93RXZlbnQueSArIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnNjcm9sbFRvcCAtIHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCkgOiAoZS5jbGllbnRZIC0gcG9zLnkpO1xyXG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xyXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpO1xyXG5cclxuICAgICAgICAvL2V4aXQgaWYgb3V0c2lkZSBpbWFnZVxyXG4gICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gdGhpcy5pbWFnZUVsZW1lbnQud2lkdGggfHwgeSA+IHRoaXMuaW1hZ2VFbGVtZW50LmhlaWdodCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy9vbGQgZGltZW5zaW9ucyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGlzIGZ1bmN0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXSkge1xyXG4gICAgICAgICAgICB2YXIgdG9wID0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnRvcDtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF07XHJcbiAgICAgICAgLy8gSGFuZGxlIHNoaWZ0IHN0YXRlIGZvciBTYWZhcmlcclxuICAgICAgICAvLyBTYWZhcmkgZG9lc24ndCBnZW5lcmF0ZSBrZXlib2FyZCBldmVudHMgZm9yIG1vZGlmaWVyczogaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2OTZcclxuICAgICAgICBpZiAodGhpcy5pc1NhZmFyaSkge1xyXG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfRFJBVztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9EUkFXKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfRFJBVyAmJiBhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbm90IGZvciBjaXJjbGUhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfRFJBVztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQ1RBTkdMRV9EUkFXKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vcmVjdGFuZ2xlIG1vZGVcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uRHJhd0FyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueDtcclxuICAgICAgICAgICAgeWRpZmYgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgTWF0aC5hYnMoeGRpZmYpLCBNYXRoLmFicyh5ZGlmZikpO1xyXG4gICAgICAgICAgICBpZiAoeGRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAoeCArIDEpICsgJ3B4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoeWRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9ICh5ICsgMSkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vc3F1YXJlIG1vZGUgLSBhbGlnbiB0byBzaG9ydGVyIHNpZGVcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uRHJhd0FyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueDtcclxuICAgICAgICAgICAgeWRpZmYgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255O1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoeGRpZmYpIDwgTWF0aC5hYnMoeWRpZmYpKSB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gTWF0aC5hYnMocGFyc2VJbnQoeGRpZmYsIDEwKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gTWF0aC5hYnMocGFyc2VJbnQoeWRpZmYsIDEwKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIGRpZmYsIGRpZmYpO1xyXG4gICAgICAgICAgICBpZiAoeGRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAodGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd254ICsgZGlmZiAqIC0xKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHlkaWZmIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSAodGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255ICsgZGlmZiAqIC0xICsgMSkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fRFJBVykge1xyXG4gICAgICAgICAgICAvL3BvbHlnb24gbW9kZVxyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25EcmF3QXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seWdvbmdyb3coYXJlYSwgeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9NT1ZFIHx8IHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9NT1ZFKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvbk1vdmVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB4ID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bng7XHJcbiAgICAgICAgICAgIHkgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueTtcclxuICAgICAgICAgICAgaWYgKHggKyB3aWR0aCA+IHRoaXMuaW1hZ2VFbGVtZW50LndpZHRoIHx8IHkgKyBoZWlnaHQgPiB0aGlzLmltYWdlRWxlbWVudC5oZWlnaHQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IHggKyAxICsgJ3B4JztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB5ICsgMSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTU9WRSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25Nb3ZlQXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgeCA9IHggLSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd254O1xyXG4gICAgICAgICAgICB5ID0geSAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnk7XHJcbiAgICAgICAgICAgIGlmICh4ICsgd2lkdGggPiB0aGlzLmltYWdlRWxlbWVudC53aWR0aCB8fCB5ICsgaGVpZ2h0ID4gdGhpcy5pbWFnZUVsZW1lbnQuaGVpZ2h0KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIGxlZnQ7XHJcbiAgICAgICAgICAgIHlkaWZmID0geSAtIHRvcDtcclxuICAgICAgICAgICAgaWYgKGFyZWEueHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbaV0gPSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ueHBvaW50c1tpXSArIHhkaWZmO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZWEueXBvaW50c1tpXSA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS55cG9pbnRzW2ldICsgeWRpZmY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0geSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfTEVGVCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBkaWZmID0geCAtIGxlZnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoKHdpZHRoICsgKC0xICogZGlmZikpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSB4ICsgMSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9ICh0b3AgKyAoZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCBwYXJzZUludCh3aWR0aCArICgtMSAqIGRpZmYpLCAxMCksIHBhcnNlSW50KGhlaWdodCArICgtMSAqIGRpZmYpLCAxMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5sZWZ0ID0geDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX1JJR0hUO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfUklHSFQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uUmVzaXplQXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgZGlmZiA9IHggLSBsZWZ0IC0gd2lkdGg7XHJcbiAgICAgICAgICAgIGlmICgod2lkdGggKyAoZGlmZikpIC0gMSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgcmlnaHRcclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0gKHRvcCArICgtMSAqIGRpZmYgLyAyKSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgKHdpZHRoICsgKGRpZmYpKSAtIDEsIChoZWlnaHQgKyAoZGlmZikpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0udG9wID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9MRUZUO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfVE9QKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvblJlc2l6ZUFyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIGRpZmYgPSB5IC0gdG9wO1xyXG4gICAgICAgICAgICBpZiAoKHdpZHRoICsgKC0xICogZGlmZikpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSB0b3BcclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0geSArIDEgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gKGxlZnQgKyAoZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoLTEgKiBkaWZmKSksIChoZWlnaHQgKyAoLTEgKiBkaWZmKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5sZWZ0ID0geDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX0JPVFRPTTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX0JPVFRPTSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBkaWZmID0geSAtIHRvcCAtIGhlaWdodDtcclxuICAgICAgICAgICAgaWYgKCh3aWR0aCArIChkaWZmKSkgLSAxID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBib3R0b21cclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IChsZWZ0ICsgKC0xICogZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoZGlmZikpIC0gMSwgKGhlaWdodCArIChkaWZmKSkgLSAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0udG9wID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9UT1A7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9MRUZUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvblJlc2l6ZUFyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIGxlZnQ7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCArICgtMSAqIHhkaWZmKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgbGVmdFxyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0geCArIDEgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgd2lkdGggKyAoLTEgKiB4ZGlmZiksIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfUklHSFQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9SSUdIVCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB4ZGlmZiA9IHggLSBsZWZ0IC0gd2lkdGg7XHJcbiAgICAgICAgICAgIGlmICgod2lkdGggKyAoeGRpZmYpKSAtIDEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL3JlYWwgcmVzaXplIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoeGRpZmYpKSAtIDEsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfTEVGVDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX1RPUCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB5ZGlmZiA9IHkgLSB0b3A7XHJcbiAgICAgICAgICAgIGlmICgoaGVpZ2h0ICsgKC0xICogeWRpZmYpKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgdG9wXHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9IHkgKyAxICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIG51bGwsIChoZWlnaHQgKyAoLTEgKiB5ZGlmZikpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB5ZGlmZiA9IHkgLSB0b3AgLSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmICgoaGVpZ2h0ICsgKHlkaWZmKSkgLSAxID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBib3R0b21cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIG51bGwsIChoZWlnaHQgKyAoeWRpZmYpKSAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5oZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnRvcCA9IHk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JlcGFpbnQgY2FudmFzIGVsZW1lbnRzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBhaW50KGFyZWEsIHRoaXMuY29uZmlnLkNMX0RSQVdfU0hBUEUsIHgsIHkpO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVjb29yZHModGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgbW91c2V1cCBvbiB0aGUgaW1hZ2UuXHJcbiAgICAqXHRIYW5kbGVzIGRyYWdnaW5nIGFuZCByZXNpemluZy5cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdC5cclxuICAgICovXHJcbiAgICBpbWdfbW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgY29uc3Qgd2luZG93RXZlbnQ6IGFueSA9IHdpbmRvdy5ldmVudDtcclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0UG9zKHRoaXMuaW1hZ2VFbGVtZW50KSxcclxuICAgICAgICAgICAgeCA9ICh0aGlzLmlzTVNJRSkgPyAod2luZG93RXZlbnQueCArIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnNjcm9sbExlZnQgLSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0KSA6IChlLmNsaWVudFggLSBwb3MueCksXHJcbiAgICAgICAgICAgIHkgPSAodGhpcy5pc01TSUUpID8gKHdpbmRvd0V2ZW50LnkgKyB0aGlzLnBhcmVudEltYWdlRWxlbWVudC5zY3JvbGxUb3AgLSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRUb3ApIDogKGUuY2xpZW50WSAtIHBvcy55KTtcclxuICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcclxuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcclxuXHJcbiAgICAgICAgLy9mb3IgZXZlcnl0aGluZyB0aGF0IGlzIG1vdmUgb3IgcmVzaXplXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXICYmXHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1NRVUFSRV9EUkFXICYmXHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1BPTFlHT05fRFJBVyAmJlxyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgIT0gdGhpcy5ETV9QT0xZR09OX0xBU1REUkFXKSB7XHJcbiAgICAgICAgICAgIC8vZW5kIGRyYWdnaW5nXHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcclxuICAgICAgICAgICAgLy9maW5pc2ggc3RhdGVcclxuICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gMDtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUFEWSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVsYXhBcmVhKHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdID09IHRoaXMuX2dldExhc3RBcmVhKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnggPSB4O1xyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIGltZ19kcmFnc3RhcnQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgbW91c2Vkb3duIG9uIHRoZSBpbWFnZS5cclxuICAgICpcdEhhbmRsZXMgYmVnZ2luaW5nIG9yIGVuZCBvZiBkcmF3LCBvciBwb2x5Z29uIHBvaW50IHNldC5cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdC5cclxuICAgICovXHJcbiAgICBpbWdfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIWUpXHJcblxyXG4gICAgICAgICAgICBlID0gd2luZG93LmV2ZW50O1xyXG5cclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0UG9zKHRoaXMuaW1hZ2VFbGVtZW50KSxcclxuICAgICAgICAgICAgeCA9IE1hdGgucm91bmQoZS5jbGllbnRYIC0gcG9zLngpLFxyXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChlLmNsaWVudFkgLSBwb3MueSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgU2hpZnQgc3RhdGVcclxuICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFyZWEgPSB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXTtcclxuICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vaXRzIG5vdCBmaW5pc2ggc3RhdGUgeWV0XHJcbiAgICAgICAgICAgIGFyZWEueHBvaW50c1thcmVhLnhwb2ludHMubGVuZ3RoXSA9IHg7XHJcbiAgICAgICAgICAgIGFyZWEueXBvaW50c1thcmVhLnlwb2ludHMubGVuZ3RoXSA9IHk7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueSA9IHk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nICYmIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1BPTFlHT05fRFJBVykge1xyXG4gICAgICAgICAgICAvL2ZpbmlzaCBhbnkgb3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVcpIHtcclxuICAgICAgICAgICAgICAgIC8vYWRkIGxhc3QgY29udHJvbHBvaW50IGFuZCB1cGRhdGUgY29vcmRzXHJcbiAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbYXJlYS54cG9pbnRzLmxlbmd0aF0gPSB4O1xyXG4gICAgICAgICAgICAgICAgYXJlYS55cG9pbnRzW2FyZWEueXBvaW50cy5sZW5ndGhdID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNvb3Jkcyh0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seWdvbnNocmluayhhcmVhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQURZKTtcclxuICAgICAgICAgICAgdGhpcy5yZWxheEFyZWEodGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0gPT0gdGhpcy5fZ2V0TGFzdEFyZWEoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5uZXh0U2hhcGUpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5hZGROZXdBcmVhKCk7XHJcbiAgICAgICAgdGhpcy5pbml0QXJlYSh0aGlzLmN1cnJlbnRpZCwgdGhpcy5uZXh0U2hhcGUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc2hhcGUgPT0gJ3BvbHknKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fUE9MWUdPTl9EUkFXO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlBPTFlHT05fRFJBVyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLnRvcCA9IHkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnhwb2ludHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0ueXBvaW50cyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS54cG9pbnRzWzBdID0geDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0ueXBvaW50c1swXSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQ1RBTkdMRV9EUkFXKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmxlZnQgPSB4ICsgJ3B4JztcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc3R5bGUudG9wID0geSArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc3R5bGUuaGVpZ2h0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfRFJBVztcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5DSVJDTEVfRFJBVyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLnRvcCA9IHkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXRCb3JkZXIodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0sICdEUkFXJyk7XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd254ID0geDtcclxuICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnkgPSB5O1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRIaWdobGlnaHRzIGEgZ2l2ZW4gYXJlYS5cclxuICAgICpcdFNldHMgb3BhY2l0eSBhbmQgcmVwYWludHMuXHJcbiAgICAqXHRAZGF0ZVx0MjAwNy4xMi4yOC4gMTg6MjM6MDBcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byBibHVyLlxyXG5cclxuICAgICovXHJcbiAgICBoaWdobGlnaHRBcmVhID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZykgeyByZXR1cm47IH0gLy9leGl0IGlmIGluIGRyYXdpbmcgc3RhdGVcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIGlmIChhcmVhICYmIGFyZWEuc2hhcGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy9hcmVhIGV4aXN0cyAtIGhpZ2hsaWdodCBpdFxyXG4gICAgICAgICAgICB0aGlzLl9zZXRCb3JkZXIoYXJlYSwgJ0hJR0hMSUdIVCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIHRoaXMuY29uZmlnLkNMX0hJR0hMSUdIVF9CRywgJy0nICsgdGhpcy5jb25maWcuaGlnaGxpZ2h0X29wYWNpdHkpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBhaW50KGFyZWEsIHRoaXMuY29uZmlnLkNMX0hJR0hMSUdIVF9TSEFQRSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRCbHVycyBhIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRTZXRzIG9wYWNpdHkgYW5kIHJlcGFpbnRzLlxyXG4gICAgKlx0QGRhdGVcdDIwMDcuMTIuMjguIDE4OjIzOjI2XHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gYmx1ci5cclxuXHJcbiAgICAqL1xyXG4gICAgYmx1ckFyZWEgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nKSB7IHJldHVybjsgfSAvL2V4aXQgaWYgaW4gZHJhd2luZyBzdGF0ZVxyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKGFyZWEgJiYgYXJlYS5zaGFwZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAvL2FyZWEgZXhpc3RzIC0gZmFkZSBpdCBiYWNrXHJcbiAgICAgICAgICAgIHRoaXMuX3NldEJvcmRlcihhcmVhLCAnTk9STScpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIHRoaXMuY29uZmlnLkNMX05PUk1fQkcsICctJyArIHRoaXMuY29uZmlnLm5vcm1fb3BhY2l0eSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9TSEFQRSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRFVkVOVCBIQU5ETEVSOiBIYW5kbGVzIGV2ZW50IG9mIG1vdXNlbW92ZSBvbiBpbWdtYXAgYXJlYXMuXHJcbiAgICAqXHQtIGNoYW5nZXMgY3Vyc29yIGRlcGVuZGluZyB3aGVyZSB3ZSBhcmUgaW5zaWRlIHRoZSBhcmVhIChidWdneSBpbiBvcGVyYSlcclxuICAgICpcdC0gaGFuZGxlcyBhcmVhIHJlc2l6ZVxyXG4gICAgKlx0LSBoYW5kbGVzIGFyZWEgbW92ZVxyXG4gICAgKlx0QHVybFx0aHR0cDovL2V2b2x0Lm9yZy9hcnRpY2xlL01pc3Npb25fSW1wb3NzaWJsZV9tb3VzZV9wb3NpdGlvbi8xNy8yMzMzNS9pbmRleC5odG1sXHJcbiAgICAqXHRAdXJsXHRodHRwOi8vbXkub3BlcmEuY29tL2NvbW11bml0eS9mb3J1bXMvdG9waWMuZG1sP2lkPTIzOTQ5OCZ0PTEyMTcxNTgwMTUmcGFnZT0xXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3QuXHJcbiAgICAqL1xyXG4gICAgYXJlYV9tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc19kcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICghZSlcclxuICAgICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgb2JqID0gKHRoaXMuaXNNU0lFKSA/IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50IDogZS5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ0RJVicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ2ltYWdlJyB8fCBvYmoudGFnTmFtZSA9PSAnZ3JvdXAnIHx8XHJcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA9PSAnc2hhcGUnIHx8IG9iai50YWdOYW1lID09ICdzdHJva2UnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBleGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlY3QgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd2luZG93RXZlbnQ6IGFueSA9IHdpbmRvdy5ldmVudDtcclxuICAgICAgICAgICAgdmFyIHhkaWZmID0gcmVjdCA/IGUuY2xpZW50WCAtIHJlY3QubGVmdCA6IHdpbmRvd0V2ZW50Lm9mZnNldFg7XHJcbiAgICAgICAgICAgIHZhciB5ZGlmZiA9IHJlY3QgPyBlLmNsaWVudFkgLSByZWN0LnRvcCA6IHdpbmRvd0V2ZW50Lm9mZnNldFk7XHJcblxyXG4gICAgICAgICAgICAvLyBBbGZvbnNvXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2FmYXJpKSB7XHJcbiAgICAgICAgICAgICAgICB4ZGlmZiAtPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICAgICAgICAgIHlkaWZmIC09IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAob2JqLnNoYXBlID09ICdyZWN0JyB8fCBvYmouc2hhcGUgPT0gJ2NpcmNsZScpO1xyXG4gICAgICAgICAgICBpZiAocmVzaXphYmxlICYmIHhkaWZmIDwgNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ3ctcmVzaXplJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXNpemFibGUgJiYgeGRpZmYgPiBwYXJzZUludChvYmouc3R5bGUud2lkdGgsIDEwKSAtIDYgJiYgeWRpZmYgPiA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgcmlnaHRcclxuICAgICAgICAgICAgICAgIG9iai5zdHlsZS5jdXJzb3IgPSAnZS1yZXNpemUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2l6YWJsZSAmJiB4ZGlmZiA+IDYgJiYgeWRpZmYgPCA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgdG9wXHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ24tcmVzaXplJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXNpemFibGUgJiYgeWRpZmYgPiBwYXJzZUludChvYmouc3R5bGUuaGVpZ2h0LCAxMCkgLSA2ICYmIHhkaWZmID4gNikge1xyXG4gICAgICAgICAgICAgICAgLy9tb3ZlIGJvdHRvbVxyXG4gICAgICAgICAgICAgICAgb2JqLnN0eWxlLmN1cnNvciA9ICdzLXJlc2l6ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgYWxsXHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvYmouYWlkICE9IHRoaXMuZHJhZ2dlZElkKSB7XHJcbiAgICAgICAgICAgICAgICAvL25vdCBkcmFnZ2VkIG9yIGRpZmZlcmVudFxyXG4gICAgICAgICAgICAgICAgaWYgKG9iai5zdHlsZS5jdXJzb3IgPT0gJ21vdmUnKSB7IG9iai5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7IH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdO1xyXG4gICAgICAgICAgICAvL21vdmVkIGhlcmUgZnJvbSBtb3VzZWRvd25cclxuICAgICAgICAgICAgaWYgKHhkaWZmIDwgNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9MRUZUO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuU1FVQVJFX1JFU0laRV9MRUZUKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0xFRlQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfUkVTSVpFX0xFRlQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHhkaWZmID4gcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApIC0gNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSByaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfUklHSFQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5TUVVBUkVfUkVTSVpFX1JJR0hUKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX1JJR0hUO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX1JFU0laRV9SSUdIVCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeGRpZmYgPiA2ICYmIHlkaWZmIDwgNikge1xyXG4gICAgICAgICAgICAgICAgLy9tb3ZlIHRvcFxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuU1FVQVJFX1JFU0laRV9UT1ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX1JFU0laRV9UT1ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHlkaWZmID4gcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKSAtIDYgJiYgeGRpZmYgPiA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgYm90dG9tXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9CT1RUT007XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5TUVVBUkVfUkVTSVpFX0JPVFRPTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9CT1RUT007XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZS8qaWYgKHhkaWZmIDwgMTAgJiYgeWRpZmYgPCAxMCApICovIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBhbGxcclxuICAgICAgICAgICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfTU9WRTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9NT1ZFKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd254ID0geGRpZmY7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueSA9IHlkaWZmO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9NT1ZFO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX01PVkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnggPSB4ZGlmZjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd255ID0geWRpZmY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmVhLnhwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS54cG9pbnRzW2ldID0gYXJlYS54cG9pbnRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnlwb2ludHNbaV0gPSBhcmVhLnlwb2ludHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1BPTFlHT05fTU9WRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5QT0xZR09OX01PVkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueCA9IHhkaWZmO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnkgPSB5ZGlmZjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb21tb24gbWVtb3J5IHNldHRpbmdzIChwcmVwYXJpbmcgdG8gbW92ZSBvciByZXNpemUpXHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKTtcclxuICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IHBhcnNlSW50KGFyZWEuc3R5bGUuaGVpZ2h0LCAxMCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApO1xyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRCb3JkZXIoYXJlYSwgJ0RSQVcnKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0b3BhY2l0eShhcmVhLCB0aGlzLmNvbmZpZy5DTF9EUkFXX0JHLCB0aGlzLmNvbmZpZy5kcmF3X29wYWNpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9pZiBkcmF3aW5nIGFuZCBub3QgaWUsIGhhdmUgdG8gcHJvcGFnYXRlIHRvIGltYWdlIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuaW1nX21vdXNlbW92ZShlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2V1cCBvbiBpbWdtYXAgYXJlYXMuXHJcbiAgICAqXHRCYXNpY2FsbHkgY2xlYXJzIGRyYWdnZWRJZC5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzX2RyYXdpbmcpIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9ICh0aGlzLmlzTVNJRSkgPyB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudCA6IGUuY3VycmVudFRhcmdldDtcclxuICAgICAgICAgICAgaWYgKG9iai50YWdOYW1lID09ICdESVYnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBsYWJlbFxyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9iai50YWdOYW1lID09ICdpbWFnZScgfHwgb2JqLnRhZ05hbWUgPT0gJ2dyb3VwJyB8fFxyXG4gICAgICAgICAgICAgICAgb2JqLnRhZ05hbWUgPT0gJ3NoYXBlJyB8fCBvYmoudGFnTmFtZSA9PSAnc3Ryb2tlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kbyB0aGlzIGJlY2F1c2Ugb2YgZXhjYW52YXNcclxuICAgICAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdICE9IG9iaikge1xyXG4gICAgICAgICAgICAgICAgLy90cnlpbmcgdG8gZHJhdyBvbiBhIGRpZmZlcmVudCBjYW52YXMsc3dpdGNoIHRvIHRoaXMgb25lXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5haWQgPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnQ2Fubm90IGlkZW50aWZ5IHRhcmdldCBhcmVhJywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vaWYgZHJhd2luZyBhbmQgbm90IGllLCBoYXZlIHRvIHByb3BhZ2F0ZSB0byBpbWFnZSBldmVudFxyXG4gICAgICAgICAgICB0aGlzLmltZ19tb3VzZXVwKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCBvZiBtb3VzZW92ZXIgb24gaW1nbWFwIGFyZWFzLlxyXG4gICAgKlx0Q2FsbHMgZ3JhZHVhbCBoaWdobGlnaHQgb24gdGhlIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBhcmVhX21vdXNlb3ZlciA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzX2RyYXdpbmcpIHtcclxuICAgICAgICAgICAgLy9pZGVudGlmeSBzb3VyY2Ugb2JqZWN0XHJcbiAgICAgICAgICAgIHZhciBvYmogPSAodGhpcy5pc01TSUUpID8gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQgOiBlLmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGlmIChvYmoudGFnTmFtZSA9PSAnRElWJykge1xyXG4gICAgICAgICAgICAgICAgLy9kbyB0aGlzIGJlY2F1c2Ugb2YgbGFiZWxcclxuICAgICAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvYmoudGFnTmFtZSA9PSAnaW1hZ2UnIHx8IG9iai50YWdOYW1lID09ICdncm91cCcgfHxcclxuICAgICAgICAgICAgICAgIG9iai50YWdOYW1lID09ICdzaGFwZScgfHwgb2JqLnRhZ05hbWUgPT0gJ3N0cm9rZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGV4Y2FudmFzXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0QXJlYShvYmouYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2VvdXQgb24gaW1nbWFwIGFyZWFzLlxyXG4gICAgKlx0Q2FsbHMgZ3JhZGllbnQgYmx1ciBvbiB0aGUgZ2l2ZW4gYXJlYS5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2VvdXQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc19kcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICghZSlcclxuICAgICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc01TSUUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gbW92aW5nIHRvIGEgY2hpbGQsIGlnbm9yZSB0aGlzIG1vdXNlb3V0IGV2ZW50XHJcbiAgICAgICAgICAgICAgICBpZiAoZS50b0VsZW1lbnQgJiYgZS5zcmNFbGVtZW50ID09IGUudG9FbGVtZW50LnBhcmVudE5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2lkZW50aWZ5IHNvdXJjZSBvYmplY3RcclxuICAgICAgICAgICAgdmFyIG9iaiA9ICh0aGlzLmlzTVNJRSkgPyBlLnNyY0VsZW1lbnQgOiBlLmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciB0YWdOYW1lID0gb2JqLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gJ2RpdicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGFnTmFtZSA9PSAnaW1hZ2UnIHx8IHRhZ05hbWUgPT0gJ2dyb3VwJyB8fFxyXG4gICAgICAgICAgICAgICAgdGFnTmFtZSA9PSAnc2hhcGUnIHx8IHRhZ05hbWUgPT0gJ3N0cm9rZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGV4Y2FudmFzXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBPbmx5IGJsdXIgdGhlIGFyZWEgaWYgaXQgaXNuJ3QgdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRpZCAhPSBvYmouYWlkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibHVyQXJlYShvYmouYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2Vkb3duIG9uIGltZ21hcCBhcmVhcy5cclxuICAgICpcdFNldHMgdGhlIHZhcmlhYmxlcyBkcmFnZ2VkaWQsIHNlbGVjdGVkaWQgYW5kIGN1cnJlbnRpZCB0byB0aGUgZ2l2ZW4gYXJlYS5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gKHRoaXMuaXNNU0lFKSA/IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50IDogZS5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ0RJVicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ2ltYWdlJyB8fCBvYmoudGFnTmFtZSA9PSAnZ3JvdXAnIHx8XHJcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA9PSAnc2hhcGUnIHx8IG9iai50YWdOYW1lID09ICdzdHJva2UnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBleGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0gIT0gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RyeWluZyB0byBkcmF3IG9uIGEgZGlmZmVyZW50IGNhbnZhcywgc3dpdGNoIHRvIHRoaXMgb25lXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5haWQgPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnQ2Fubm90IGlkZW50aWZ5IHRhcmdldCBhcmVhJywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmx1ckFyZWEodGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50aWQgPSBvYmouYWlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRBcmVhKG9iai5haWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRJZCA9IHRoaXMuY3VycmVudGlkO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWQgPSB0aGlzLmN1cnJlbnRpZDtcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uU2VsZWN0QXJlYScsIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdKTtcclxuICAgICAgICAgICAgLy9zdG9wIGV2ZW50IHByb3BhZ2F0aW9uIHRvIGRvY3VtZW50IGxldmVsXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTVNJRSkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL2lmIGRyYXdpbmcgYW5kIG5vdCBpZSwgaGF2ZSB0byBwcm9wYWdhdGUgdG8gaW1hZ2UgZXZlbnRcclxuICAgICAgICAgICAgdGhpcy5pbWdfbW91c2Vkb3duKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCAna2V5ZG93bicgb24gZG9jdW1lbnQuXHJcbiAgICAqXHRIYW5kbGVzIFNISUZUIGhvbGQgd2hpbGUgZHJhd2luZy5cclxuICAgICpcdE5vdGU6IFNhZmFyaSBkb2Vzbid0IGdlbmVyYXRlIGtleWJvYXJkIGV2ZW50cyBmb3IgbW9kaWZpZXJzOlxyXG4gICAgKlx0QHVybFx0aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2OTZcclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGRvY19rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09IDQ2IHx8IGUua2V5ID09IFwiRGVsZXRlXCIpIHtcclxuICAgICAgICAgICAgLy9kZWxldGUga2V5IHByZXNzZWRcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCAhPT0gbnVsbCAmJiAhdGhpcy5pc19kcmF3aW5nKSB7IHRoaXMucmVtb3ZlQXJlYSh0aGlzLnNlbGVjdGVkSWQpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxNiB8fCBlLmtleSA9PSBcIlNoaWZ0XCIpIHtcclxuICAgICAgICAgICAgLy9zaGlmdCBrZXkgcHJlc3NlZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX0RSQVcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX0RSQVc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9EUkFXKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCAna2V5dXAnIG9uIGRvY3VtZW50LlxyXG4gICAgKlx0SGFuZGxlcyBTSElGVCByZWxlYXNlIHdoaWxlIGRyYXdpbmcuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBkb2Nfa2V5dXAgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTYgfHwgZS5rZXkgPT0gXCJTaGlmdFwiKSB7XHJcbiAgICAgICAgICAgIC8vc2hpZnQga2V5IHJlbGVhc2VkXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfRFJBVyAmJiB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgIC8vbm90IGZvciBjaXJjbGUhXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfRFJBVyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgJ21vdXNlZG93bicgb24gZG9jdW1lbnQuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBkb2NfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0R2V0IHRoZSByZWFsIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKlx0RGVhbCB3aXRoIGJyb3dzZXIgZGlmZmVyZW5jZXMgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSBwb3NpdGlvbiBvZiBhbiBhcmVhLlxyXG4gICAgKlx0QHBhcmFtXHRlbGVtZW50XHRUaGUgZWxlbWVudCB5b3Ugd2FudCB0aGUgcG9zaXRpb24gb2YuXHJcbiAgICAqXHRAcmV0dXJuXHRBbiBvYmplY3Qgd2l0aCB4IGFuZCB5IG1lbWJlcnMuXHJcbiAgICAqL1xyXG4gICAgX2dldFBvcyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcblxyXG4gICAgICAgIHZhciBib3VuZGluZyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogYm91bmRpbmcubGVmdCwgeTogYm91bmRpbmcudG9wIH07XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEdldHMgdGhlIGxhc3QgKHZpc2libGUgYW5kIGVkaXRhYmxlKSBhcmVhLlxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QGRhdGVcdDIwMDYtMDYtMTUgMTY6MzQ6NTFcclxuICAgICpcdEByZXR1cm5zXHRUaGUgbGFzdCBhcmVhIG9iamVjdCBvciBudWxsLlxyXG4gICAgKi9cclxuICAgIF9nZXRMYXN0QXJlYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5hcmVhcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJlYXNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFBhcnNlcyBjc3NUZXh0IHRvIHNpbmdsZSBzdHlsZSBkZWNsYXJhdGlvbnMuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAZGF0ZVx0MjUtMDktMjAwNyAxODoxOTo1MVxyXG4gICAgKlx0QHBhcmFtIG9ialx0VGhlIERPTSBvYmplY3QgdG8gYXBwbHkgc3R5bGVzIG9uLlxyXG4gICAgKlx0QHBhcmFtIGNzc1RleHRcdFRoZSBjc3MgZGVjbGFyYXRpb25zIHRvIGFwcGx5LlxyXG4gICAgKi9cclxuICAgIGFzc2lnbkNTUyA9IGZ1bmN0aW9uIChvYmosIGNzc1RleHQpIHtcclxuICAgICAgICB2YXIgcGFydHMgPSBjc3NUZXh0LnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcCA9IHBhcnRzW2ldLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIC8vd2UgbmVlZCB0byBjYW1lbGNhc2UgYnkgLSBzaWduc1xyXG4gICAgICAgICAgICB2YXIgcHAgPSB0cmltKHBbMF0pLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9wID0gcHBbMF07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcHAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcmVwbGFjZSBmaXJzdCBsZXR0ZXJzIHRvIHVwcGVyY2FzZVxyXG4gICAgICAgICAgICAgICAgcHJvcCArPSBwcFtqXS5yZXBsYWNlKC9eXFx3LywgcHBbal0uc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9iai5zdHlsZVt0cmltKHByb3ApXSA9IHRyaW0ocFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRUbyBmaXJlIGNhbGxiYWNrIGhvb2tzIG9uIGN1c3RvbSBldmVudHMsIHBhc3NpbmcgdGhlbSB0aGUgb2JqZWN0IG9mIHRoZSBldmVudC5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBkYXRlXHQxMy0xMC0yMDA3IDE1OjI0OjQ5XHJcbiAgICAqXHRAcGFyYW0gZXZ0XHRUaGUgdHlwZSBvZiBldmVudFxyXG4gICAgKlx0QHBhcmFtIG9ialx0VGhlIG9iamVjdCBvZiB0aGUgZXZlbnQuIChjYW4gYmUgYW4gaWQsIGEgc3RyaW5nLCBhbiBvYmplY3QsIHdoYXRldmVyIGlzIG1vc3QgcmVsZXZhbnQpXHJcbiAgICAqL1xyXG4gICAgZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGV2dCwgb2JqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5jdXN0b21fY2FsbGJhY2tzW2V2dF0gPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuY3VzdG9tX2NhbGxiYWNrc1tldnRdKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRUbyBzZXQgYXJlYSBkaW1lbnNpb25zLlxyXG4gICAgKlx0VGhpcyBpcyBuZWVkZWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQgaW4gYWxsIGJyb3dzZXJzLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QGRhdGVcdDEwLTEyLTIwMDcgMjI6Mjk6NDFcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSAoY2FudmFzKSB0byByZXNpemUuXHJcbiAgICAqXHRAcGFyYW1cdHdcdFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cclxuICAgICpcdEBwYXJhbVx0aFx0VGhlIGRlc2lyZWQgaGVpZ2h0IGluIHBpeGVscy5cclxuICAgICovXHJcbiAgICBzZXRBcmVhU2l6ZSA9IGZ1bmN0aW9uIChpZCwgdywgaCkge1xyXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCkgeyBpZCA9IHRoaXMuY3VycmVudGlkOyB9XHJcbiAgICAgICAgdmFyIGFyZWEgPSB0aGlzLmFyZWFzW2lkXTtcclxuICAgICAgICBpZiAodyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcmVhLndpZHRoID0gdztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS53aWR0aCA9ICh3KSArICdweCc7XHJcbiAgICAgICAgICAgIGFyZWEuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcmVhLmhlaWdodCA9IGg7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUuaGVpZ2h0ID0gKGgpICsgJ3B4JztcclxuICAgICAgICAgICAgYXJlYS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RGlzYWJsZSBzZWxlY3Rpb24gb24gYSBnaXZlbiBvYmplY3QuXHJcbiAgICAqXHRUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIFNhZmFyaSwgd2hlcmUgZHJhZ2dpbmcgYXJvdW5kIGFyZWFzXHJcbiAgICAqXHRrZWVwcyBzZWxlY3RpbmcgYWxsIHNvcnRzIG9mIHRoaW5ncy5cclxuICAgICpcdEBhdXRob3JcdEJyZXQgVGF5bG9yXHJcbiAgICAqXHRAdXJsXHRodHRwOi8vYWpheGNvb2tib29rLm9yZy9kaXNhYmxlLXRleHQtc2VsZWN0aW9uL1xyXG4gICAgKlx0QGRhdGVcdDI3LTA3LTIwMDggMTo1Nzo0NVxyXG4gICAgKlx0QHBhcmFtXHRlbGVtZW50XHRUaGUgRE9NIGVsZW1lbnQgb24gd2hpY2ggeW91IHdhbnQgdG8gZGlzYWJsZSBzZWxlY3Rpb24uXHJcbiAgICAqL1xyXG4gICAgZGlzYWJsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICd1bmRlZmluZWQnIHx8ICFlbGVtZW50KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudW5zZWxlY3RhYmxlICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC51bnNlbGVjdGFibGUgPSBcIm9uXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5zdHlsZS5Nb3pVc2VyU2VsZWN0ICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAgICAqXHRUcmltcyBhIHN0cmluZy5cclxuICAgICpcdENoYW5nZWQgbm90IHRvIGV4dGVuZCBTdHJpbmcgYnV0IHVzZSBvd24gZnVuY3Rpb24gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxyXG4gICAgKlx0QHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIHRyaW0uXHJcbiAgICAqL1xyXG5mdW5jdGlvbiB0cmltKHN0cikge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XHJcbn07Il19
|