@aws-mdaa/dataops-job-l3-construct 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +5265 -0
- package/README.md +11 -0
- package/docs/dataops-job.drawio +45 -0
- package/docs/dataops-job.png +0 -0
- package/lib/dataops-job-l3-construct.d.ts +344 -0
- package/lib/dataops-job-l3-construct.js +295 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +24 -0
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/README.md +185 -0
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.d.ts +57 -0
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.js +200 -0
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/package.json +46 -0
- package/node_modules/@aws-mdaa/s3-inventory-helper/README.md +3 -0
- package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.d.ts +66 -0
- package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.js +224 -0
- package/node_modules/@aws-mdaa/s3-inventory-helper/package.json +46 -0
- package/node_modules/lodash/LICENSE +47 -0
- package/node_modules/lodash/README.md +39 -0
- package/node_modules/lodash/_DataView.js +7 -0
- package/node_modules/lodash/_Hash.js +32 -0
- package/node_modules/lodash/_LazyWrapper.js +28 -0
- package/node_modules/lodash/_ListCache.js +32 -0
- package/node_modules/lodash/_LodashWrapper.js +22 -0
- package/node_modules/lodash/_Map.js +7 -0
- package/node_modules/lodash/_MapCache.js +32 -0
- package/node_modules/lodash/_Promise.js +7 -0
- package/node_modules/lodash/_Set.js +7 -0
- package/node_modules/lodash/_SetCache.js +27 -0
- package/node_modules/lodash/_Stack.js +27 -0
- package/node_modules/lodash/_Symbol.js +6 -0
- package/node_modules/lodash/_Uint8Array.js +6 -0
- package/node_modules/lodash/_WeakMap.js +7 -0
- package/node_modules/lodash/_apply.js +21 -0
- package/node_modules/lodash/_arrayAggregator.js +22 -0
- package/node_modules/lodash/_arrayEach.js +22 -0
- package/node_modules/lodash/_arrayEachRight.js +21 -0
- package/node_modules/lodash/_arrayEvery.js +23 -0
- package/node_modules/lodash/_arrayFilter.js +25 -0
- package/node_modules/lodash/_arrayIncludes.js +17 -0
- package/node_modules/lodash/_arrayIncludesWith.js +22 -0
- package/node_modules/lodash/_arrayLikeKeys.js +49 -0
- package/node_modules/lodash/_arrayMap.js +21 -0
- package/node_modules/lodash/_arrayPush.js +20 -0
- package/node_modules/lodash/_arrayReduce.js +26 -0
- package/node_modules/lodash/_arrayReduceRight.js +24 -0
- package/node_modules/lodash/_arraySample.js +15 -0
- package/node_modules/lodash/_arraySampleSize.js +17 -0
- package/node_modules/lodash/_arrayShuffle.js +15 -0
- package/node_modules/lodash/_arraySome.js +23 -0
- package/node_modules/lodash/_asciiSize.js +12 -0
- package/node_modules/lodash/_asciiToArray.js +12 -0
- package/node_modules/lodash/_asciiWords.js +15 -0
- package/node_modules/lodash/_assignMergeValue.js +20 -0
- package/node_modules/lodash/_assignValue.js +28 -0
- package/node_modules/lodash/_assocIndexOf.js +21 -0
- package/node_modules/lodash/_baseAggregator.js +21 -0
- package/node_modules/lodash/_baseAssign.js +17 -0
- package/node_modules/lodash/_baseAssignIn.js +17 -0
- package/node_modules/lodash/_baseAssignValue.js +25 -0
- package/node_modules/lodash/_baseAt.js +23 -0
- package/node_modules/lodash/_baseClamp.js +22 -0
- package/node_modules/lodash/_baseClone.js +166 -0
- package/node_modules/lodash/_baseConforms.js +18 -0
- package/node_modules/lodash/_baseConformsTo.js +27 -0
- package/node_modules/lodash/_baseCreate.js +30 -0
- package/node_modules/lodash/_baseDelay.js +21 -0
- package/node_modules/lodash/_baseDifference.js +67 -0
- package/node_modules/lodash/_baseEach.js +14 -0
- package/node_modules/lodash/_baseEachRight.js +14 -0
- package/node_modules/lodash/_baseEvery.js +21 -0
- package/node_modules/lodash/_baseExtremum.js +32 -0
- package/node_modules/lodash/_baseFill.js +32 -0
- package/node_modules/lodash/_baseFilter.js +21 -0
- package/node_modules/lodash/_baseFindIndex.js +24 -0
- package/node_modules/lodash/_baseFindKey.js +23 -0
- package/node_modules/lodash/_baseFlatten.js +38 -0
- package/node_modules/lodash/_baseFor.js +16 -0
- package/node_modules/lodash/_baseForOwn.js +16 -0
- package/node_modules/lodash/_baseForOwnRight.js +16 -0
- package/node_modules/lodash/_baseForRight.js +15 -0
- package/node_modules/lodash/_baseFunctions.js +19 -0
- package/node_modules/lodash/_baseGet.js +24 -0
- package/node_modules/lodash/_baseGetAllKeys.js +20 -0
- package/node_modules/lodash/_baseGetTag.js +28 -0
- package/node_modules/lodash/_baseGt.js +14 -0
- package/node_modules/lodash/_baseHas.js +19 -0
- package/node_modules/lodash/_baseHasIn.js +13 -0
- package/node_modules/lodash/_baseInRange.js +18 -0
- package/node_modules/lodash/_baseIndexOf.js +20 -0
- package/node_modules/lodash/_baseIndexOfWith.js +23 -0
- package/node_modules/lodash/_baseIntersection.js +74 -0
- package/node_modules/lodash/_baseInverter.js +21 -0
- package/node_modules/lodash/_baseInvoke.js +24 -0
- package/node_modules/lodash/_baseIsArguments.js +18 -0
- package/node_modules/lodash/_baseIsArrayBuffer.js +17 -0
- package/node_modules/lodash/_baseIsDate.js +18 -0
- package/node_modules/lodash/_baseIsEqual.js +28 -0
- package/node_modules/lodash/_baseIsEqualDeep.js +83 -0
- package/node_modules/lodash/_baseIsMap.js +18 -0
- package/node_modules/lodash/_baseIsMatch.js +62 -0
- package/node_modules/lodash/_baseIsNaN.js +12 -0
- package/node_modules/lodash/_baseIsNative.js +47 -0
- package/node_modules/lodash/_baseIsRegExp.js +18 -0
- package/node_modules/lodash/_baseIsSet.js +18 -0
- package/node_modules/lodash/_baseIsTypedArray.js +60 -0
- package/node_modules/lodash/_baseIteratee.js +31 -0
- package/node_modules/lodash/_baseKeys.js +30 -0
- package/node_modules/lodash/_baseKeysIn.js +33 -0
- package/node_modules/lodash/_baseLodash.js +10 -0
- package/node_modules/lodash/_baseLt.js +14 -0
- package/node_modules/lodash/_baseMap.js +22 -0
- package/node_modules/lodash/_baseMatches.js +22 -0
- package/node_modules/lodash/_baseMatchesProperty.js +33 -0
- package/node_modules/lodash/_baseMean.js +20 -0
- package/node_modules/lodash/_baseMerge.js +42 -0
- package/node_modules/lodash/_baseMergeDeep.js +94 -0
- package/node_modules/lodash/_baseNth.js +20 -0
- package/node_modules/lodash/_baseOrderBy.js +49 -0
- package/node_modules/lodash/_basePick.js +19 -0
- package/node_modules/lodash/_basePickBy.js +30 -0
- package/node_modules/lodash/_baseProperty.js +14 -0
- package/node_modules/lodash/_basePropertyDeep.js +16 -0
- package/node_modules/lodash/_basePropertyOf.js +14 -0
- package/node_modules/lodash/_basePullAll.js +51 -0
- package/node_modules/lodash/_basePullAt.js +37 -0
- package/node_modules/lodash/_baseRandom.js +18 -0
- package/node_modules/lodash/_baseRange.js +28 -0
- package/node_modules/lodash/_baseReduce.js +23 -0
- package/node_modules/lodash/_baseRepeat.js +35 -0
- package/node_modules/lodash/_baseRest.js +17 -0
- package/node_modules/lodash/_baseSample.js +15 -0
- package/node_modules/lodash/_baseSampleSize.js +18 -0
- package/node_modules/lodash/_baseSet.js +51 -0
- package/node_modules/lodash/_baseSetData.js +17 -0
- package/node_modules/lodash/_baseSetToString.js +22 -0
- package/node_modules/lodash/_baseShuffle.js +15 -0
- package/node_modules/lodash/_baseSlice.js +31 -0
- package/node_modules/lodash/_baseSome.js +22 -0
- package/node_modules/lodash/_baseSortBy.js +21 -0
- package/node_modules/lodash/_baseSortedIndex.js +42 -0
- package/node_modules/lodash/_baseSortedIndexBy.js +67 -0
- package/node_modules/lodash/_baseSortedUniq.js +30 -0
- package/node_modules/lodash/_baseSum.js +24 -0
- package/node_modules/lodash/_baseTimes.js +20 -0
- package/node_modules/lodash/_baseToNumber.js +24 -0
- package/node_modules/lodash/_baseToPairs.js +18 -0
- package/node_modules/lodash/_baseToString.js +37 -0
- package/node_modules/lodash/_baseTrim.js +19 -0
- package/node_modules/lodash/_baseUnary.js +14 -0
- package/node_modules/lodash/_baseUniq.js +72 -0
- package/node_modules/lodash/_baseUnset.js +20 -0
- package/node_modules/lodash/_baseUpdate.js +18 -0
- package/node_modules/lodash/_baseValues.js +19 -0
- package/node_modules/lodash/_baseWhile.js +26 -0
- package/node_modules/lodash/_baseWrapperValue.js +25 -0
- package/node_modules/lodash/_baseXor.js +36 -0
- package/node_modules/lodash/_baseZipObject.js +23 -0
- package/node_modules/lodash/_cacheHas.js +13 -0
- package/node_modules/lodash/_castArrayLikeObject.js +14 -0
- package/node_modules/lodash/_castFunction.js +14 -0
- package/node_modules/lodash/_castPath.js +21 -0
- package/node_modules/lodash/_castRest.js +14 -0
- package/node_modules/lodash/_castSlice.js +18 -0
- package/node_modules/lodash/_charsEndIndex.js +19 -0
- package/node_modules/lodash/_charsStartIndex.js +20 -0
- package/node_modules/lodash/_cloneArrayBuffer.js +16 -0
- package/node_modules/lodash/_cloneBuffer.js +35 -0
- package/node_modules/lodash/_cloneDataView.js +16 -0
- package/node_modules/lodash/_cloneRegExp.js +17 -0
- package/node_modules/lodash/_cloneSymbol.js +18 -0
- package/node_modules/lodash/_cloneTypedArray.js +16 -0
- package/node_modules/lodash/_compareAscending.js +41 -0
- package/node_modules/lodash/_compareMultiple.js +44 -0
- package/node_modules/lodash/_composeArgs.js +39 -0
- package/node_modules/lodash/_composeArgsRight.js +41 -0
- package/node_modules/lodash/_copyArray.js +20 -0
- package/node_modules/lodash/_copyObject.js +40 -0
- package/node_modules/lodash/_copySymbols.js +16 -0
- package/node_modules/lodash/_copySymbolsIn.js +16 -0
- package/node_modules/lodash/_coreJsData.js +6 -0
- package/node_modules/lodash/_countHolders.js +21 -0
- package/node_modules/lodash/_createAggregator.js +23 -0
- package/node_modules/lodash/_createAssigner.js +37 -0
- package/node_modules/lodash/_createBaseEach.js +32 -0
- package/node_modules/lodash/_createBaseFor.js +25 -0
- package/node_modules/lodash/_createBind.js +28 -0
- package/node_modules/lodash/_createCaseFirst.js +33 -0
- package/node_modules/lodash/_createCompounder.js +24 -0
- package/node_modules/lodash/_createCtor.js +37 -0
- package/node_modules/lodash/_createCurry.js +46 -0
- package/node_modules/lodash/_createFind.js +25 -0
- package/node_modules/lodash/_createFlow.js +78 -0
- package/node_modules/lodash/_createHybrid.js +92 -0
- package/node_modules/lodash/_createInverter.js +17 -0
- package/node_modules/lodash/_createMathOperation.js +38 -0
- package/node_modules/lodash/_createOver.js +27 -0
- package/node_modules/lodash/_createPadding.js +33 -0
- package/node_modules/lodash/_createPartial.js +43 -0
- package/node_modules/lodash/_createRange.js +30 -0
- package/node_modules/lodash/_createRecurry.js +56 -0
- package/node_modules/lodash/_createRelationalOperation.js +20 -0
- package/node_modules/lodash/_createRound.js +35 -0
- package/node_modules/lodash/_createSet.js +19 -0
- package/node_modules/lodash/_createToPairs.js +30 -0
- package/node_modules/lodash/_createWrap.js +106 -0
- package/node_modules/lodash/_customDefaultsAssignIn.js +29 -0
- package/node_modules/lodash/_customDefaultsMerge.js +28 -0
- package/node_modules/lodash/_customOmitClone.js +16 -0
- package/node_modules/lodash/_deburrLetter.js +71 -0
- package/node_modules/lodash/_defineProperty.js +11 -0
- package/node_modules/lodash/_equalArrays.js +84 -0
- package/node_modules/lodash/_equalByTag.js +112 -0
- package/node_modules/lodash/_equalObjects.js +90 -0
- package/node_modules/lodash/_escapeHtmlChar.js +21 -0
- package/node_modules/lodash/_escapeStringChar.js +22 -0
- package/node_modules/lodash/_flatRest.js +16 -0
- package/node_modules/lodash/_freeGlobal.js +4 -0
- package/node_modules/lodash/_getAllKeys.js +16 -0
- package/node_modules/lodash/_getAllKeysIn.js +17 -0
- package/node_modules/lodash/_getData.js +15 -0
- package/node_modules/lodash/_getFuncName.js +31 -0
- package/node_modules/lodash/_getHolder.js +13 -0
- package/node_modules/lodash/_getMapData.js +18 -0
- package/node_modules/lodash/_getMatchData.js +24 -0
- package/node_modules/lodash/_getNative.js +17 -0
- package/node_modules/lodash/_getPrototype.js +6 -0
- package/node_modules/lodash/_getRawTag.js +46 -0
- package/node_modules/lodash/_getSymbols.js +30 -0
- package/node_modules/lodash/_getSymbolsIn.js +25 -0
- package/node_modules/lodash/_getTag.js +58 -0
- package/node_modules/lodash/_getValue.js +13 -0
- package/node_modules/lodash/_getView.js +33 -0
- package/node_modules/lodash/_getWrapDetails.js +17 -0
- package/node_modules/lodash/_hasPath.js +39 -0
- package/node_modules/lodash/_hasUnicode.js +26 -0
- package/node_modules/lodash/_hasUnicodeWord.js +15 -0
- package/node_modules/lodash/_hashClear.js +15 -0
- package/node_modules/lodash/_hashDelete.js +17 -0
- package/node_modules/lodash/_hashGet.js +30 -0
- package/node_modules/lodash/_hashHas.js +23 -0
- package/node_modules/lodash/_hashSet.js +23 -0
- package/node_modules/lodash/_initCloneArray.js +26 -0
- package/node_modules/lodash/_initCloneByTag.js +77 -0
- package/node_modules/lodash/_initCloneObject.js +18 -0
- package/node_modules/lodash/_insertWrapDetails.js +23 -0
- package/node_modules/lodash/_isFlattenable.js +20 -0
- package/node_modules/lodash/_isIndex.js +25 -0
- package/node_modules/lodash/_isIterateeCall.js +30 -0
- package/node_modules/lodash/_isKey.js +29 -0
- package/node_modules/lodash/_isKeyable.js +15 -0
- package/node_modules/lodash/_isLaziable.js +28 -0
- package/node_modules/lodash/_isMaskable.js +14 -0
- package/node_modules/lodash/_isMasked.js +20 -0
- package/node_modules/lodash/_isPrototype.js +18 -0
- package/node_modules/lodash/_isStrictComparable.js +15 -0
- package/node_modules/lodash/_iteratorToArray.js +18 -0
- package/node_modules/lodash/_lazyClone.js +23 -0
- package/node_modules/lodash/_lazyReverse.js +23 -0
- package/node_modules/lodash/_lazyValue.js +69 -0
- package/node_modules/lodash/_listCacheClear.js +13 -0
- package/node_modules/lodash/_listCacheDelete.js +35 -0
- package/node_modules/lodash/_listCacheGet.js +19 -0
- package/node_modules/lodash/_listCacheHas.js +16 -0
- package/node_modules/lodash/_listCacheSet.js +26 -0
- package/node_modules/lodash/_mapCacheClear.js +21 -0
- package/node_modules/lodash/_mapCacheDelete.js +18 -0
- package/node_modules/lodash/_mapCacheGet.js +16 -0
- package/node_modules/lodash/_mapCacheHas.js +16 -0
- package/node_modules/lodash/_mapCacheSet.js +22 -0
- package/node_modules/lodash/_mapToArray.js +18 -0
- package/node_modules/lodash/_matchesStrictComparable.js +20 -0
- package/node_modules/lodash/_memoizeCapped.js +26 -0
- package/node_modules/lodash/_mergeData.js +90 -0
- package/node_modules/lodash/_metaMap.js +6 -0
- package/node_modules/lodash/_nativeCreate.js +6 -0
- package/node_modules/lodash/_nativeKeys.js +6 -0
- package/node_modules/lodash/_nativeKeysIn.js +20 -0
- package/node_modules/lodash/_nodeUtil.js +30 -0
- package/node_modules/lodash/_objectToString.js +22 -0
- package/node_modules/lodash/_overArg.js +15 -0
- package/node_modules/lodash/_overRest.js +36 -0
- package/node_modules/lodash/_parent.js +16 -0
- package/node_modules/lodash/_reEscape.js +4 -0
- package/node_modules/lodash/_reEvaluate.js +4 -0
- package/node_modules/lodash/_reInterpolate.js +4 -0
- package/node_modules/lodash/_realNames.js +4 -0
- package/node_modules/lodash/_reorder.js +29 -0
- package/node_modules/lodash/_replaceHolders.js +29 -0
- package/node_modules/lodash/_root.js +9 -0
- package/node_modules/lodash/_safeGet.js +21 -0
- package/node_modules/lodash/_setCacheAdd.js +19 -0
- package/node_modules/lodash/_setCacheHas.js +14 -0
- package/node_modules/lodash/_setData.js +20 -0
- package/node_modules/lodash/_setToArray.js +18 -0
- package/node_modules/lodash/_setToPairs.js +18 -0
- package/node_modules/lodash/_setToString.js +14 -0
- package/node_modules/lodash/_setWrapToString.js +21 -0
- package/node_modules/lodash/_shortOut.js +37 -0
- package/node_modules/lodash/_shuffleSelf.js +28 -0
- package/node_modules/lodash/_stackClear.js +15 -0
- package/node_modules/lodash/_stackDelete.js +18 -0
- package/node_modules/lodash/_stackGet.js +14 -0
- package/node_modules/lodash/_stackHas.js +14 -0
- package/node_modules/lodash/_stackSet.js +34 -0
- package/node_modules/lodash/_strictIndexOf.js +23 -0
- package/node_modules/lodash/_strictLastIndexOf.js +21 -0
- package/node_modules/lodash/_stringSize.js +18 -0
- package/node_modules/lodash/_stringToArray.js +18 -0
- package/node_modules/lodash/_stringToPath.js +27 -0
- package/node_modules/lodash/_toKey.js +21 -0
- package/node_modules/lodash/_toSource.js +26 -0
- package/node_modules/lodash/_trimmedEndIndex.js +19 -0
- package/node_modules/lodash/_unescapeHtmlChar.js +21 -0
- package/node_modules/lodash/_unicodeSize.js +44 -0
- package/node_modules/lodash/_unicodeToArray.js +40 -0
- package/node_modules/lodash/_unicodeWords.js +69 -0
- package/node_modules/lodash/_updateWrapDetails.js +46 -0
- package/node_modules/lodash/_wrapperClone.js +23 -0
- package/node_modules/lodash/add.js +22 -0
- package/node_modules/lodash/after.js +42 -0
- package/node_modules/lodash/array.js +67 -0
- package/node_modules/lodash/ary.js +29 -0
- package/node_modules/lodash/assign.js +58 -0
- package/node_modules/lodash/assignIn.js +40 -0
- package/node_modules/lodash/assignInWith.js +38 -0
- package/node_modules/lodash/assignWith.js +37 -0
- package/node_modules/lodash/at.js +23 -0
- package/node_modules/lodash/attempt.js +35 -0
- package/node_modules/lodash/before.js +40 -0
- package/node_modules/lodash/bind.js +57 -0
- package/node_modules/lodash/bindAll.js +41 -0
- package/node_modules/lodash/bindKey.js +68 -0
- package/node_modules/lodash/camelCase.js +29 -0
- package/node_modules/lodash/capitalize.js +23 -0
- package/node_modules/lodash/castArray.js +44 -0
- package/node_modules/lodash/ceil.js +26 -0
- package/node_modules/lodash/chain.js +38 -0
- package/node_modules/lodash/chunk.js +50 -0
- package/node_modules/lodash/clamp.js +39 -0
- package/node_modules/lodash/clone.js +36 -0
- package/node_modules/lodash/cloneDeep.js +29 -0
- package/node_modules/lodash/cloneDeepWith.js +40 -0
- package/node_modules/lodash/cloneWith.js +42 -0
- package/node_modules/lodash/collection.js +30 -0
- package/node_modules/lodash/commit.js +33 -0
- package/node_modules/lodash/compact.js +31 -0
- package/node_modules/lodash/concat.js +43 -0
- package/node_modules/lodash/cond.js +60 -0
- package/node_modules/lodash/conforms.js +35 -0
- package/node_modules/lodash/conformsTo.js +32 -0
- package/node_modules/lodash/constant.js +26 -0
- package/node_modules/lodash/core.js +3877 -0
- package/node_modules/lodash/core.min.js +29 -0
- package/node_modules/lodash/countBy.js +40 -0
- package/node_modules/lodash/create.js +43 -0
- package/node_modules/lodash/curry.js +57 -0
- package/node_modules/lodash/curryRight.js +54 -0
- package/node_modules/lodash/date.js +3 -0
- package/node_modules/lodash/debounce.js +191 -0
- package/node_modules/lodash/deburr.js +45 -0
- package/node_modules/lodash/defaultTo.js +25 -0
- package/node_modules/lodash/defaults.js +64 -0
- package/node_modules/lodash/defaultsDeep.js +30 -0
- package/node_modules/lodash/defer.js +26 -0
- package/node_modules/lodash/delay.js +28 -0
- package/node_modules/lodash/difference.js +33 -0
- package/node_modules/lodash/differenceBy.js +44 -0
- package/node_modules/lodash/differenceWith.js +40 -0
- package/node_modules/lodash/divide.js +22 -0
- package/node_modules/lodash/drop.js +38 -0
- package/node_modules/lodash/dropRight.js +39 -0
- package/node_modules/lodash/dropRightWhile.js +45 -0
- package/node_modules/lodash/dropWhile.js +45 -0
- package/node_modules/lodash/each.js +1 -0
- package/node_modules/lodash/eachRight.js +1 -0
- package/node_modules/lodash/endsWith.js +43 -0
- package/node_modules/lodash/entries.js +1 -0
- package/node_modules/lodash/entriesIn.js +1 -0
- package/node_modules/lodash/eq.js +37 -0
- package/node_modules/lodash/escape.js +43 -0
- package/node_modules/lodash/escapeRegExp.js +32 -0
- package/node_modules/lodash/every.js +56 -0
- package/node_modules/lodash/extend.js +1 -0
- package/node_modules/lodash/extendWith.js +1 -0
- package/node_modules/lodash/fill.js +45 -0
- package/node_modules/lodash/filter.js +52 -0
- package/node_modules/lodash/find.js +42 -0
- package/node_modules/lodash/findIndex.js +55 -0
- package/node_modules/lodash/findKey.js +44 -0
- package/node_modules/lodash/findLast.js +25 -0
- package/node_modules/lodash/findLastIndex.js +59 -0
- package/node_modules/lodash/findLastKey.js +44 -0
- package/node_modules/lodash/first.js +1 -0
- package/node_modules/lodash/flake.lock +40 -0
- package/node_modules/lodash/flake.nix +20 -0
- package/node_modules/lodash/flatMap.js +29 -0
- package/node_modules/lodash/flatMapDeep.js +31 -0
- package/node_modules/lodash/flatMapDepth.js +31 -0
- package/node_modules/lodash/flatten.js +22 -0
- package/node_modules/lodash/flattenDeep.js +25 -0
- package/node_modules/lodash/flattenDepth.js +33 -0
- package/node_modules/lodash/flip.js +28 -0
- package/node_modules/lodash/floor.js +26 -0
- package/node_modules/lodash/flow.js +27 -0
- package/node_modules/lodash/flowRight.js +26 -0
- package/node_modules/lodash/forEach.js +41 -0
- package/node_modules/lodash/forEachRight.js +31 -0
- package/node_modules/lodash/forIn.js +39 -0
- package/node_modules/lodash/forInRight.js +37 -0
- package/node_modules/lodash/forOwn.js +36 -0
- package/node_modules/lodash/forOwnRight.js +34 -0
- package/node_modules/lodash/fp/F.js +1 -0
- package/node_modules/lodash/fp/T.js +1 -0
- package/node_modules/lodash/fp/__.js +1 -0
- package/node_modules/lodash/fp/_baseConvert.js +569 -0
- package/node_modules/lodash/fp/_convertBrowser.js +18 -0
- package/node_modules/lodash/fp/_falseOptions.js +7 -0
- package/node_modules/lodash/fp/_mapping.js +358 -0
- package/node_modules/lodash/fp/_util.js +16 -0
- package/node_modules/lodash/fp/add.js +5 -0
- package/node_modules/lodash/fp/after.js +5 -0
- package/node_modules/lodash/fp/all.js +1 -0
- package/node_modules/lodash/fp/allPass.js +1 -0
- package/node_modules/lodash/fp/always.js +1 -0
- package/node_modules/lodash/fp/any.js +1 -0
- package/node_modules/lodash/fp/anyPass.js +1 -0
- package/node_modules/lodash/fp/apply.js +1 -0
- package/node_modules/lodash/fp/array.js +2 -0
- package/node_modules/lodash/fp/ary.js +5 -0
- package/node_modules/lodash/fp/assign.js +5 -0
- package/node_modules/lodash/fp/assignAll.js +5 -0
- package/node_modules/lodash/fp/assignAllWith.js +5 -0
- package/node_modules/lodash/fp/assignIn.js +5 -0
- package/node_modules/lodash/fp/assignInAll.js +5 -0
- package/node_modules/lodash/fp/assignInAllWith.js +5 -0
- package/node_modules/lodash/fp/assignInWith.js +5 -0
- package/node_modules/lodash/fp/assignWith.js +5 -0
- package/node_modules/lodash/fp/assoc.js +1 -0
- package/node_modules/lodash/fp/assocPath.js +1 -0
- package/node_modules/lodash/fp/at.js +5 -0
- package/node_modules/lodash/fp/attempt.js +5 -0
- package/node_modules/lodash/fp/before.js +5 -0
- package/node_modules/lodash/fp/bind.js +5 -0
- package/node_modules/lodash/fp/bindAll.js +5 -0
- package/node_modules/lodash/fp/bindKey.js +5 -0
- package/node_modules/lodash/fp/camelCase.js +5 -0
- package/node_modules/lodash/fp/capitalize.js +5 -0
- package/node_modules/lodash/fp/castArray.js +5 -0
- package/node_modules/lodash/fp/ceil.js +5 -0
- package/node_modules/lodash/fp/chain.js +5 -0
- package/node_modules/lodash/fp/chunk.js +5 -0
- package/node_modules/lodash/fp/clamp.js +5 -0
- package/node_modules/lodash/fp/clone.js +5 -0
- package/node_modules/lodash/fp/cloneDeep.js +5 -0
- package/node_modules/lodash/fp/cloneDeepWith.js +5 -0
- package/node_modules/lodash/fp/cloneWith.js +5 -0
- package/node_modules/lodash/fp/collection.js +2 -0
- package/node_modules/lodash/fp/commit.js +5 -0
- package/node_modules/lodash/fp/compact.js +5 -0
- package/node_modules/lodash/fp/complement.js +1 -0
- package/node_modules/lodash/fp/compose.js +1 -0
- package/node_modules/lodash/fp/concat.js +5 -0
- package/node_modules/lodash/fp/cond.js +5 -0
- package/node_modules/lodash/fp/conforms.js +1 -0
- package/node_modules/lodash/fp/conformsTo.js +5 -0
- package/node_modules/lodash/fp/constant.js +5 -0
- package/node_modules/lodash/fp/contains.js +1 -0
- package/node_modules/lodash/fp/convert.js +18 -0
- package/node_modules/lodash/fp/countBy.js +5 -0
- package/node_modules/lodash/fp/create.js +5 -0
- package/node_modules/lodash/fp/curry.js +5 -0
- package/node_modules/lodash/fp/curryN.js +5 -0
- package/node_modules/lodash/fp/curryRight.js +5 -0
- package/node_modules/lodash/fp/curryRightN.js +5 -0
- package/node_modules/lodash/fp/date.js +2 -0
- package/node_modules/lodash/fp/debounce.js +5 -0
- package/node_modules/lodash/fp/deburr.js +5 -0
- package/node_modules/lodash/fp/defaultTo.js +5 -0
- package/node_modules/lodash/fp/defaults.js +5 -0
- package/node_modules/lodash/fp/defaultsAll.js +5 -0
- package/node_modules/lodash/fp/defaultsDeep.js +5 -0
- package/node_modules/lodash/fp/defaultsDeepAll.js +5 -0
- package/node_modules/lodash/fp/defer.js +5 -0
- package/node_modules/lodash/fp/delay.js +5 -0
- package/node_modules/lodash/fp/difference.js +5 -0
- package/node_modules/lodash/fp/differenceBy.js +5 -0
- package/node_modules/lodash/fp/differenceWith.js +5 -0
- package/node_modules/lodash/fp/dissoc.js +1 -0
- package/node_modules/lodash/fp/dissocPath.js +1 -0
- package/node_modules/lodash/fp/divide.js +5 -0
- package/node_modules/lodash/fp/drop.js +5 -0
- package/node_modules/lodash/fp/dropLast.js +1 -0
- package/node_modules/lodash/fp/dropLastWhile.js +1 -0
- package/node_modules/lodash/fp/dropRight.js +5 -0
- package/node_modules/lodash/fp/dropRightWhile.js +5 -0
- package/node_modules/lodash/fp/dropWhile.js +5 -0
- package/node_modules/lodash/fp/each.js +1 -0
- package/node_modules/lodash/fp/eachRight.js +1 -0
- package/node_modules/lodash/fp/endsWith.js +5 -0
- package/node_modules/lodash/fp/entries.js +1 -0
- package/node_modules/lodash/fp/entriesIn.js +1 -0
- package/node_modules/lodash/fp/eq.js +5 -0
- package/node_modules/lodash/fp/equals.js +1 -0
- package/node_modules/lodash/fp/escape.js +5 -0
- package/node_modules/lodash/fp/escapeRegExp.js +5 -0
- package/node_modules/lodash/fp/every.js +5 -0
- package/node_modules/lodash/fp/extend.js +1 -0
- package/node_modules/lodash/fp/extendAll.js +1 -0
- package/node_modules/lodash/fp/extendAllWith.js +1 -0
- package/node_modules/lodash/fp/extendWith.js +1 -0
- package/node_modules/lodash/fp/fill.js +5 -0
- package/node_modules/lodash/fp/filter.js +5 -0
- package/node_modules/lodash/fp/find.js +5 -0
- package/node_modules/lodash/fp/findFrom.js +5 -0
- package/node_modules/lodash/fp/findIndex.js +5 -0
- package/node_modules/lodash/fp/findIndexFrom.js +5 -0
- package/node_modules/lodash/fp/findKey.js +5 -0
- package/node_modules/lodash/fp/findLast.js +5 -0
- package/node_modules/lodash/fp/findLastFrom.js +5 -0
- package/node_modules/lodash/fp/findLastIndex.js +5 -0
- package/node_modules/lodash/fp/findLastIndexFrom.js +5 -0
- package/node_modules/lodash/fp/findLastKey.js +5 -0
- package/node_modules/lodash/fp/first.js +1 -0
- package/node_modules/lodash/fp/flatMap.js +5 -0
- package/node_modules/lodash/fp/flatMapDeep.js +5 -0
- package/node_modules/lodash/fp/flatMapDepth.js +5 -0
- package/node_modules/lodash/fp/flatten.js +5 -0
- package/node_modules/lodash/fp/flattenDeep.js +5 -0
- package/node_modules/lodash/fp/flattenDepth.js +5 -0
- package/node_modules/lodash/fp/flip.js +5 -0
- package/node_modules/lodash/fp/floor.js +5 -0
- package/node_modules/lodash/fp/flow.js +5 -0
- package/node_modules/lodash/fp/flowRight.js +5 -0
- package/node_modules/lodash/fp/forEach.js +5 -0
- package/node_modules/lodash/fp/forEachRight.js +5 -0
- package/node_modules/lodash/fp/forIn.js +5 -0
- package/node_modules/lodash/fp/forInRight.js +5 -0
- package/node_modules/lodash/fp/forOwn.js +5 -0
- package/node_modules/lodash/fp/forOwnRight.js +5 -0
- package/node_modules/lodash/fp/fromPairs.js +5 -0
- package/node_modules/lodash/fp/function.js +2 -0
- package/node_modules/lodash/fp/functions.js +5 -0
- package/node_modules/lodash/fp/functionsIn.js +5 -0
- package/node_modules/lodash/fp/get.js +5 -0
- package/node_modules/lodash/fp/getOr.js +5 -0
- package/node_modules/lodash/fp/groupBy.js +5 -0
- package/node_modules/lodash/fp/gt.js +5 -0
- package/node_modules/lodash/fp/gte.js +5 -0
- package/node_modules/lodash/fp/has.js +5 -0
- package/node_modules/lodash/fp/hasIn.js +5 -0
- package/node_modules/lodash/fp/head.js +5 -0
- package/node_modules/lodash/fp/identical.js +1 -0
- package/node_modules/lodash/fp/identity.js +5 -0
- package/node_modules/lodash/fp/inRange.js +5 -0
- package/node_modules/lodash/fp/includes.js +5 -0
- package/node_modules/lodash/fp/includesFrom.js +5 -0
- package/node_modules/lodash/fp/indexBy.js +1 -0
- package/node_modules/lodash/fp/indexOf.js +5 -0
- package/node_modules/lodash/fp/indexOfFrom.js +5 -0
- package/node_modules/lodash/fp/init.js +1 -0
- package/node_modules/lodash/fp/initial.js +5 -0
- package/node_modules/lodash/fp/intersection.js +5 -0
- package/node_modules/lodash/fp/intersectionBy.js +5 -0
- package/node_modules/lodash/fp/intersectionWith.js +5 -0
- package/node_modules/lodash/fp/invert.js +5 -0
- package/node_modules/lodash/fp/invertBy.js +5 -0
- package/node_modules/lodash/fp/invertObj.js +1 -0
- package/node_modules/lodash/fp/invoke.js +5 -0
- package/node_modules/lodash/fp/invokeArgs.js +5 -0
- package/node_modules/lodash/fp/invokeArgsMap.js +5 -0
- package/node_modules/lodash/fp/invokeMap.js +5 -0
- package/node_modules/lodash/fp/isArguments.js +5 -0
- package/node_modules/lodash/fp/isArray.js +5 -0
- package/node_modules/lodash/fp/isArrayBuffer.js +5 -0
- package/node_modules/lodash/fp/isArrayLike.js +5 -0
- package/node_modules/lodash/fp/isArrayLikeObject.js +5 -0
- package/node_modules/lodash/fp/isBoolean.js +5 -0
- package/node_modules/lodash/fp/isBuffer.js +5 -0
- package/node_modules/lodash/fp/isDate.js +5 -0
- package/node_modules/lodash/fp/isElement.js +5 -0
- package/node_modules/lodash/fp/isEmpty.js +5 -0
- package/node_modules/lodash/fp/isEqual.js +5 -0
- package/node_modules/lodash/fp/isEqualWith.js +5 -0
- package/node_modules/lodash/fp/isError.js +5 -0
- package/node_modules/lodash/fp/isFinite.js +5 -0
- package/node_modules/lodash/fp/isFunction.js +5 -0
- package/node_modules/lodash/fp/isInteger.js +5 -0
- package/node_modules/lodash/fp/isLength.js +5 -0
- package/node_modules/lodash/fp/isMap.js +5 -0
- package/node_modules/lodash/fp/isMatch.js +5 -0
- package/node_modules/lodash/fp/isMatchWith.js +5 -0
- package/node_modules/lodash/fp/isNaN.js +5 -0
- package/node_modules/lodash/fp/isNative.js +5 -0
- package/node_modules/lodash/fp/isNil.js +5 -0
- package/node_modules/lodash/fp/isNull.js +5 -0
- package/node_modules/lodash/fp/isNumber.js +5 -0
- package/node_modules/lodash/fp/isObject.js +5 -0
- package/node_modules/lodash/fp/isObjectLike.js +5 -0
- package/node_modules/lodash/fp/isPlainObject.js +5 -0
- package/node_modules/lodash/fp/isRegExp.js +5 -0
- package/node_modules/lodash/fp/isSafeInteger.js +5 -0
- package/node_modules/lodash/fp/isSet.js +5 -0
- package/node_modules/lodash/fp/isString.js +5 -0
- package/node_modules/lodash/fp/isSymbol.js +5 -0
- package/node_modules/lodash/fp/isTypedArray.js +5 -0
- package/node_modules/lodash/fp/isUndefined.js +5 -0
- package/node_modules/lodash/fp/isWeakMap.js +5 -0
- package/node_modules/lodash/fp/isWeakSet.js +5 -0
- package/node_modules/lodash/fp/iteratee.js +5 -0
- package/node_modules/lodash/fp/join.js +5 -0
- package/node_modules/lodash/fp/juxt.js +1 -0
- package/node_modules/lodash/fp/kebabCase.js +5 -0
- package/node_modules/lodash/fp/keyBy.js +5 -0
- package/node_modules/lodash/fp/keys.js +5 -0
- package/node_modules/lodash/fp/keysIn.js +5 -0
- package/node_modules/lodash/fp/lang.js +2 -0
- package/node_modules/lodash/fp/last.js +5 -0
- package/node_modules/lodash/fp/lastIndexOf.js +5 -0
- package/node_modules/lodash/fp/lastIndexOfFrom.js +5 -0
- package/node_modules/lodash/fp/lowerCase.js +5 -0
- package/node_modules/lodash/fp/lowerFirst.js +5 -0
- package/node_modules/lodash/fp/lt.js +5 -0
- package/node_modules/lodash/fp/lte.js +5 -0
- package/node_modules/lodash/fp/map.js +5 -0
- package/node_modules/lodash/fp/mapKeys.js +5 -0
- package/node_modules/lodash/fp/mapValues.js +5 -0
- package/node_modules/lodash/fp/matches.js +1 -0
- package/node_modules/lodash/fp/matchesProperty.js +5 -0
- package/node_modules/lodash/fp/math.js +2 -0
- package/node_modules/lodash/fp/max.js +5 -0
- package/node_modules/lodash/fp/maxBy.js +5 -0
- package/node_modules/lodash/fp/mean.js +5 -0
- package/node_modules/lodash/fp/meanBy.js +5 -0
- package/node_modules/lodash/fp/memoize.js +5 -0
- package/node_modules/lodash/fp/merge.js +5 -0
- package/node_modules/lodash/fp/mergeAll.js +5 -0
- package/node_modules/lodash/fp/mergeAllWith.js +5 -0
- package/node_modules/lodash/fp/mergeWith.js +5 -0
- package/node_modules/lodash/fp/method.js +5 -0
- package/node_modules/lodash/fp/methodOf.js +5 -0
- package/node_modules/lodash/fp/min.js +5 -0
- package/node_modules/lodash/fp/minBy.js +5 -0
- package/node_modules/lodash/fp/mixin.js +5 -0
- package/node_modules/lodash/fp/multiply.js +5 -0
- package/node_modules/lodash/fp/nAry.js +1 -0
- package/node_modules/lodash/fp/negate.js +5 -0
- package/node_modules/lodash/fp/next.js +5 -0
- package/node_modules/lodash/fp/noop.js +5 -0
- package/node_modules/lodash/fp/now.js +5 -0
- package/node_modules/lodash/fp/nth.js +5 -0
- package/node_modules/lodash/fp/nthArg.js +5 -0
- package/node_modules/lodash/fp/number.js +2 -0
- package/node_modules/lodash/fp/object.js +2 -0
- package/node_modules/lodash/fp/omit.js +5 -0
- package/node_modules/lodash/fp/omitAll.js +1 -0
- package/node_modules/lodash/fp/omitBy.js +5 -0
- package/node_modules/lodash/fp/once.js +5 -0
- package/node_modules/lodash/fp/orderBy.js +5 -0
- package/node_modules/lodash/fp/over.js +5 -0
- package/node_modules/lodash/fp/overArgs.js +5 -0
- package/node_modules/lodash/fp/overEvery.js +5 -0
- package/node_modules/lodash/fp/overSome.js +5 -0
- package/node_modules/lodash/fp/pad.js +5 -0
- package/node_modules/lodash/fp/padChars.js +5 -0
- package/node_modules/lodash/fp/padCharsEnd.js +5 -0
- package/node_modules/lodash/fp/padCharsStart.js +5 -0
- package/node_modules/lodash/fp/padEnd.js +5 -0
- package/node_modules/lodash/fp/padStart.js +5 -0
- package/node_modules/lodash/fp/parseInt.js +5 -0
- package/node_modules/lodash/fp/partial.js +5 -0
- package/node_modules/lodash/fp/partialRight.js +5 -0
- package/node_modules/lodash/fp/partition.js +5 -0
- package/node_modules/lodash/fp/path.js +1 -0
- package/node_modules/lodash/fp/pathEq.js +1 -0
- package/node_modules/lodash/fp/pathOr.js +1 -0
- package/node_modules/lodash/fp/paths.js +1 -0
- package/node_modules/lodash/fp/pick.js +5 -0
- package/node_modules/lodash/fp/pickAll.js +1 -0
- package/node_modules/lodash/fp/pickBy.js +5 -0
- package/node_modules/lodash/fp/pipe.js +1 -0
- package/node_modules/lodash/fp/placeholder.js +6 -0
- package/node_modules/lodash/fp/plant.js +5 -0
- package/node_modules/lodash/fp/pluck.js +1 -0
- package/node_modules/lodash/fp/prop.js +1 -0
- package/node_modules/lodash/fp/propEq.js +1 -0
- package/node_modules/lodash/fp/propOr.js +1 -0
- package/node_modules/lodash/fp/property.js +1 -0
- package/node_modules/lodash/fp/propertyOf.js +5 -0
- package/node_modules/lodash/fp/props.js +1 -0
- package/node_modules/lodash/fp/pull.js +5 -0
- package/node_modules/lodash/fp/pullAll.js +5 -0
- package/node_modules/lodash/fp/pullAllBy.js +5 -0
- package/node_modules/lodash/fp/pullAllWith.js +5 -0
- package/node_modules/lodash/fp/pullAt.js +5 -0
- package/node_modules/lodash/fp/random.js +5 -0
- package/node_modules/lodash/fp/range.js +5 -0
- package/node_modules/lodash/fp/rangeRight.js +5 -0
- package/node_modules/lodash/fp/rangeStep.js +5 -0
- package/node_modules/lodash/fp/rangeStepRight.js +5 -0
- package/node_modules/lodash/fp/rearg.js +5 -0
- package/node_modules/lodash/fp/reduce.js +5 -0
- package/node_modules/lodash/fp/reduceRight.js +5 -0
- package/node_modules/lodash/fp/reject.js +5 -0
- package/node_modules/lodash/fp/remove.js +5 -0
- package/node_modules/lodash/fp/repeat.js +5 -0
- package/node_modules/lodash/fp/replace.js +5 -0
- package/node_modules/lodash/fp/rest.js +5 -0
- package/node_modules/lodash/fp/restFrom.js +5 -0
- package/node_modules/lodash/fp/result.js +5 -0
- package/node_modules/lodash/fp/reverse.js +5 -0
- package/node_modules/lodash/fp/round.js +5 -0
- package/node_modules/lodash/fp/sample.js +5 -0
- package/node_modules/lodash/fp/sampleSize.js +5 -0
- package/node_modules/lodash/fp/seq.js +2 -0
- package/node_modules/lodash/fp/set.js +5 -0
- package/node_modules/lodash/fp/setWith.js +5 -0
- package/node_modules/lodash/fp/shuffle.js +5 -0
- package/node_modules/lodash/fp/size.js +5 -0
- package/node_modules/lodash/fp/slice.js +5 -0
- package/node_modules/lodash/fp/snakeCase.js +5 -0
- package/node_modules/lodash/fp/some.js +5 -0
- package/node_modules/lodash/fp/sortBy.js +5 -0
- package/node_modules/lodash/fp/sortedIndex.js +5 -0
- package/node_modules/lodash/fp/sortedIndexBy.js +5 -0
- package/node_modules/lodash/fp/sortedIndexOf.js +5 -0
- package/node_modules/lodash/fp/sortedLastIndex.js +5 -0
- package/node_modules/lodash/fp/sortedLastIndexBy.js +5 -0
- package/node_modules/lodash/fp/sortedLastIndexOf.js +5 -0
- package/node_modules/lodash/fp/sortedUniq.js +5 -0
- package/node_modules/lodash/fp/sortedUniqBy.js +5 -0
- package/node_modules/lodash/fp/split.js +5 -0
- package/node_modules/lodash/fp/spread.js +5 -0
- package/node_modules/lodash/fp/spreadFrom.js +5 -0
- package/node_modules/lodash/fp/startCase.js +5 -0
- package/node_modules/lodash/fp/startsWith.js +5 -0
- package/node_modules/lodash/fp/string.js +2 -0
- package/node_modules/lodash/fp/stubArray.js +5 -0
- package/node_modules/lodash/fp/stubFalse.js +5 -0
- package/node_modules/lodash/fp/stubObject.js +5 -0
- package/node_modules/lodash/fp/stubString.js +5 -0
- package/node_modules/lodash/fp/stubTrue.js +5 -0
- package/node_modules/lodash/fp/subtract.js +5 -0
- package/node_modules/lodash/fp/sum.js +5 -0
- package/node_modules/lodash/fp/sumBy.js +5 -0
- package/node_modules/lodash/fp/symmetricDifference.js +1 -0
- package/node_modules/lodash/fp/symmetricDifferenceBy.js +1 -0
- package/node_modules/lodash/fp/symmetricDifferenceWith.js +1 -0
- package/node_modules/lodash/fp/tail.js +5 -0
- package/node_modules/lodash/fp/take.js +5 -0
- package/node_modules/lodash/fp/takeLast.js +1 -0
- package/node_modules/lodash/fp/takeLastWhile.js +1 -0
- package/node_modules/lodash/fp/takeRight.js +5 -0
- package/node_modules/lodash/fp/takeRightWhile.js +5 -0
- package/node_modules/lodash/fp/takeWhile.js +5 -0
- package/node_modules/lodash/fp/tap.js +5 -0
- package/node_modules/lodash/fp/template.js +5 -0
- package/node_modules/lodash/fp/templateSettings.js +5 -0
- package/node_modules/lodash/fp/throttle.js +5 -0
- package/node_modules/lodash/fp/thru.js +5 -0
- package/node_modules/lodash/fp/times.js +5 -0
- package/node_modules/lodash/fp/toArray.js +5 -0
- package/node_modules/lodash/fp/toFinite.js +5 -0
- package/node_modules/lodash/fp/toInteger.js +5 -0
- package/node_modules/lodash/fp/toIterator.js +5 -0
- package/node_modules/lodash/fp/toJSON.js +5 -0
- package/node_modules/lodash/fp/toLength.js +5 -0
- package/node_modules/lodash/fp/toLower.js +5 -0
- package/node_modules/lodash/fp/toNumber.js +5 -0
- package/node_modules/lodash/fp/toPairs.js +5 -0
- package/node_modules/lodash/fp/toPairsIn.js +5 -0
- package/node_modules/lodash/fp/toPath.js +5 -0
- package/node_modules/lodash/fp/toPlainObject.js +5 -0
- package/node_modules/lodash/fp/toSafeInteger.js +5 -0
- package/node_modules/lodash/fp/toString.js +5 -0
- package/node_modules/lodash/fp/toUpper.js +5 -0
- package/node_modules/lodash/fp/transform.js +5 -0
- package/node_modules/lodash/fp/trim.js +5 -0
- package/node_modules/lodash/fp/trimChars.js +5 -0
- package/node_modules/lodash/fp/trimCharsEnd.js +5 -0
- package/node_modules/lodash/fp/trimCharsStart.js +5 -0
- package/node_modules/lodash/fp/trimEnd.js +5 -0
- package/node_modules/lodash/fp/trimStart.js +5 -0
- package/node_modules/lodash/fp/truncate.js +5 -0
- package/node_modules/lodash/fp/unapply.js +1 -0
- package/node_modules/lodash/fp/unary.js +5 -0
- package/node_modules/lodash/fp/unescape.js +5 -0
- package/node_modules/lodash/fp/union.js +5 -0
- package/node_modules/lodash/fp/unionBy.js +5 -0
- package/node_modules/lodash/fp/unionWith.js +5 -0
- package/node_modules/lodash/fp/uniq.js +5 -0
- package/node_modules/lodash/fp/uniqBy.js +5 -0
- package/node_modules/lodash/fp/uniqWith.js +5 -0
- package/node_modules/lodash/fp/uniqueId.js +5 -0
- package/node_modules/lodash/fp/unnest.js +1 -0
- package/node_modules/lodash/fp/unset.js +5 -0
- package/node_modules/lodash/fp/unzip.js +5 -0
- package/node_modules/lodash/fp/unzipWith.js +5 -0
- package/node_modules/lodash/fp/update.js +5 -0
- package/node_modules/lodash/fp/updateWith.js +5 -0
- package/node_modules/lodash/fp/upperCase.js +5 -0
- package/node_modules/lodash/fp/upperFirst.js +5 -0
- package/node_modules/lodash/fp/useWith.js +1 -0
- package/node_modules/lodash/fp/util.js +2 -0
- package/node_modules/lodash/fp/value.js +5 -0
- package/node_modules/lodash/fp/valueOf.js +5 -0
- package/node_modules/lodash/fp/values.js +5 -0
- package/node_modules/lodash/fp/valuesIn.js +5 -0
- package/node_modules/lodash/fp/where.js +1 -0
- package/node_modules/lodash/fp/whereEq.js +1 -0
- package/node_modules/lodash/fp/without.js +5 -0
- package/node_modules/lodash/fp/words.js +5 -0
- package/node_modules/lodash/fp/wrap.js +5 -0
- package/node_modules/lodash/fp/wrapperAt.js +5 -0
- package/node_modules/lodash/fp/wrapperChain.js +5 -0
- package/node_modules/lodash/fp/wrapperLodash.js +5 -0
- package/node_modules/lodash/fp/wrapperReverse.js +5 -0
- package/node_modules/lodash/fp/wrapperValue.js +5 -0
- package/node_modules/lodash/fp/xor.js +5 -0
- package/node_modules/lodash/fp/xorBy.js +5 -0
- package/node_modules/lodash/fp/xorWith.js +5 -0
- package/node_modules/lodash/fp/zip.js +5 -0
- package/node_modules/lodash/fp/zipAll.js +5 -0
- package/node_modules/lodash/fp/zipObj.js +1 -0
- package/node_modules/lodash/fp/zipObject.js +5 -0
- package/node_modules/lodash/fp/zipObjectDeep.js +5 -0
- package/node_modules/lodash/fp/zipWith.js +5 -0
- package/node_modules/lodash/fp.js +2 -0
- package/node_modules/lodash/fromPairs.js +28 -0
- package/node_modules/lodash/function.js +25 -0
- package/node_modules/lodash/functions.js +31 -0
- package/node_modules/lodash/functionsIn.js +31 -0
- package/node_modules/lodash/get.js +33 -0
- package/node_modules/lodash/groupBy.js +41 -0
- package/node_modules/lodash/gt.js +29 -0
- package/node_modules/lodash/gte.js +30 -0
- package/node_modules/lodash/has.js +35 -0
- package/node_modules/lodash/hasIn.js +34 -0
- package/node_modules/lodash/head.js +23 -0
- package/node_modules/lodash/identity.js +21 -0
- package/node_modules/lodash/inRange.js +55 -0
- package/node_modules/lodash/includes.js +53 -0
- package/node_modules/lodash/index.js +1 -0
- package/node_modules/lodash/indexOf.js +42 -0
- package/node_modules/lodash/initial.js +22 -0
- package/node_modules/lodash/intersection.js +30 -0
- package/node_modules/lodash/intersectionBy.js +45 -0
- package/node_modules/lodash/intersectionWith.js +41 -0
- package/node_modules/lodash/invert.js +42 -0
- package/node_modules/lodash/invertBy.js +56 -0
- package/node_modules/lodash/invoke.js +24 -0
- package/node_modules/lodash/invokeMap.js +41 -0
- package/node_modules/lodash/isArguments.js +36 -0
- package/node_modules/lodash/isArray.js +26 -0
- package/node_modules/lodash/isArrayBuffer.js +27 -0
- package/node_modules/lodash/isArrayLike.js +33 -0
- package/node_modules/lodash/isArrayLikeObject.js +33 -0
- package/node_modules/lodash/isBoolean.js +29 -0
- package/node_modules/lodash/isBuffer.js +38 -0
- package/node_modules/lodash/isDate.js +27 -0
- package/node_modules/lodash/isElement.js +25 -0
- package/node_modules/lodash/isEmpty.js +77 -0
- package/node_modules/lodash/isEqual.js +35 -0
- package/node_modules/lodash/isEqualWith.js +41 -0
- package/node_modules/lodash/isError.js +36 -0
- package/node_modules/lodash/isFinite.js +36 -0
- package/node_modules/lodash/isFunction.js +37 -0
- package/node_modules/lodash/isInteger.js +33 -0
- package/node_modules/lodash/isLength.js +35 -0
- package/node_modules/lodash/isMap.js +27 -0
- package/node_modules/lodash/isMatch.js +36 -0
- package/node_modules/lodash/isMatchWith.js +41 -0
- package/node_modules/lodash/isNaN.js +38 -0
- package/node_modules/lodash/isNative.js +40 -0
- package/node_modules/lodash/isNil.js +25 -0
- package/node_modules/lodash/isNull.js +22 -0
- package/node_modules/lodash/isNumber.js +38 -0
- package/node_modules/lodash/isObject.js +31 -0
- package/node_modules/lodash/isObjectLike.js +29 -0
- package/node_modules/lodash/isPlainObject.js +62 -0
- package/node_modules/lodash/isRegExp.js +27 -0
- package/node_modules/lodash/isSafeInteger.js +37 -0
- package/node_modules/lodash/isSet.js +27 -0
- package/node_modules/lodash/isString.js +30 -0
- package/node_modules/lodash/isSymbol.js +29 -0
- package/node_modules/lodash/isTypedArray.js +27 -0
- package/node_modules/lodash/isUndefined.js +22 -0
- package/node_modules/lodash/isWeakMap.js +28 -0
- package/node_modules/lodash/isWeakSet.js +28 -0
- package/node_modules/lodash/iteratee.js +53 -0
- package/node_modules/lodash/join.js +26 -0
- package/node_modules/lodash/kebabCase.js +28 -0
- package/node_modules/lodash/keyBy.js +36 -0
- package/node_modules/lodash/keys.js +37 -0
- package/node_modules/lodash/keysIn.js +32 -0
- package/node_modules/lodash/lang.js +58 -0
- package/node_modules/lodash/last.js +20 -0
- package/node_modules/lodash/lastIndexOf.js +46 -0
- package/node_modules/lodash/lodash.js +17209 -0
- package/node_modules/lodash/lodash.min.js +140 -0
- package/node_modules/lodash/lowerCase.js +27 -0
- package/node_modules/lodash/lowerFirst.js +22 -0
- package/node_modules/lodash/lt.js +29 -0
- package/node_modules/lodash/lte.js +30 -0
- package/node_modules/lodash/map.js +53 -0
- package/node_modules/lodash/mapKeys.js +36 -0
- package/node_modules/lodash/mapValues.js +43 -0
- package/node_modules/lodash/matches.js +46 -0
- package/node_modules/lodash/matchesProperty.js +44 -0
- package/node_modules/lodash/math.js +17 -0
- package/node_modules/lodash/max.js +29 -0
- package/node_modules/lodash/maxBy.js +34 -0
- package/node_modules/lodash/mean.js +22 -0
- package/node_modules/lodash/meanBy.js +31 -0
- package/node_modules/lodash/memoize.js +73 -0
- package/node_modules/lodash/merge.js +39 -0
- package/node_modules/lodash/mergeWith.js +39 -0
- package/node_modules/lodash/method.js +34 -0
- package/node_modules/lodash/methodOf.js +33 -0
- package/node_modules/lodash/min.js +29 -0
- package/node_modules/lodash/minBy.js +34 -0
- package/node_modules/lodash/mixin.js +74 -0
- package/node_modules/lodash/multiply.js +22 -0
- package/node_modules/lodash/negate.js +40 -0
- package/node_modules/lodash/next.js +35 -0
- package/node_modules/lodash/noop.js +17 -0
- package/node_modules/lodash/now.js +23 -0
- package/node_modules/lodash/nth.js +29 -0
- package/node_modules/lodash/nthArg.js +32 -0
- package/node_modules/lodash/number.js +5 -0
- package/node_modules/lodash/object.js +49 -0
- package/node_modules/lodash/omit.js +57 -0
- package/node_modules/lodash/omitBy.js +29 -0
- package/node_modules/lodash/once.js +25 -0
- package/node_modules/lodash/orderBy.js +47 -0
- package/node_modules/lodash/over.js +24 -0
- package/node_modules/lodash/overArgs.js +61 -0
- package/node_modules/lodash/overEvery.js +34 -0
- package/node_modules/lodash/overSome.js +37 -0
- package/node_modules/lodash/package.json +17 -0
- package/node_modules/lodash/pad.js +49 -0
- package/node_modules/lodash/padEnd.js +39 -0
- package/node_modules/lodash/padStart.js +39 -0
- package/node_modules/lodash/parseInt.js +43 -0
- package/node_modules/lodash/partial.js +50 -0
- package/node_modules/lodash/partialRight.js +49 -0
- package/node_modules/lodash/partition.js +43 -0
- package/node_modules/lodash/pick.js +25 -0
- package/node_modules/lodash/pickBy.js +37 -0
- package/node_modules/lodash/plant.js +48 -0
- package/node_modules/lodash/property.js +32 -0
- package/node_modules/lodash/propertyOf.js +30 -0
- package/node_modules/lodash/pull.js +29 -0
- package/node_modules/lodash/pullAll.js +29 -0
- package/node_modules/lodash/pullAllBy.js +33 -0
- package/node_modules/lodash/pullAllWith.js +32 -0
- package/node_modules/lodash/pullAt.js +43 -0
- package/node_modules/lodash/random.js +82 -0
- package/node_modules/lodash/range.js +46 -0
- package/node_modules/lodash/rangeRight.js +41 -0
- package/node_modules/lodash/rearg.js +33 -0
- package/node_modules/lodash/reduce.js +51 -0
- package/node_modules/lodash/reduceRight.js +36 -0
- package/node_modules/lodash/reject.js +46 -0
- package/node_modules/lodash/release.md +48 -0
- package/node_modules/lodash/remove.js +53 -0
- package/node_modules/lodash/repeat.js +37 -0
- package/node_modules/lodash/replace.js +29 -0
- package/node_modules/lodash/rest.js +40 -0
- package/node_modules/lodash/result.js +56 -0
- package/node_modules/lodash/reverse.js +34 -0
- package/node_modules/lodash/round.js +26 -0
- package/node_modules/lodash/sample.js +24 -0
- package/node_modules/lodash/sampleSize.js +37 -0
- package/node_modules/lodash/seq.js +16 -0
- package/node_modules/lodash/set.js +35 -0
- package/node_modules/lodash/setWith.js +32 -0
- package/node_modules/lodash/shuffle.js +25 -0
- package/node_modules/lodash/size.js +46 -0
- package/node_modules/lodash/slice.js +37 -0
- package/node_modules/lodash/snakeCase.js +28 -0
- package/node_modules/lodash/some.js +51 -0
- package/node_modules/lodash/sortBy.js +48 -0
- package/node_modules/lodash/sortedIndex.js +24 -0
- package/node_modules/lodash/sortedIndexBy.js +33 -0
- package/node_modules/lodash/sortedIndexOf.js +31 -0
- package/node_modules/lodash/sortedLastIndex.js +25 -0
- package/node_modules/lodash/sortedLastIndexBy.js +33 -0
- package/node_modules/lodash/sortedLastIndexOf.js +31 -0
- package/node_modules/lodash/sortedUniq.js +24 -0
- package/node_modules/lodash/sortedUniqBy.js +26 -0
- package/node_modules/lodash/split.js +52 -0
- package/node_modules/lodash/spread.js +63 -0
- package/node_modules/lodash/startCase.js +29 -0
- package/node_modules/lodash/startsWith.js +39 -0
- package/node_modules/lodash/string.js +33 -0
- package/node_modules/lodash/stubArray.js +23 -0
- package/node_modules/lodash/stubFalse.js +18 -0
- package/node_modules/lodash/stubObject.js +23 -0
- package/node_modules/lodash/stubString.js +18 -0
- package/node_modules/lodash/stubTrue.js +18 -0
- package/node_modules/lodash/subtract.js +22 -0
- package/node_modules/lodash/sum.js +24 -0
- package/node_modules/lodash/sumBy.js +33 -0
- package/node_modules/lodash/tail.js +22 -0
- package/node_modules/lodash/take.js +37 -0
- package/node_modules/lodash/takeRight.js +39 -0
- package/node_modules/lodash/takeRightWhile.js +45 -0
- package/node_modules/lodash/takeWhile.js +45 -0
- package/node_modules/lodash/tap.js +29 -0
- package/node_modules/lodash/template.js +272 -0
- package/node_modules/lodash/templateSettings.js +67 -0
- package/node_modules/lodash/throttle.js +69 -0
- package/node_modules/lodash/thru.js +28 -0
- package/node_modules/lodash/times.js +51 -0
- package/node_modules/lodash/toArray.js +58 -0
- package/node_modules/lodash/toFinite.js +42 -0
- package/node_modules/lodash/toInteger.js +36 -0
- package/node_modules/lodash/toIterator.js +23 -0
- package/node_modules/lodash/toJSON.js +1 -0
- package/node_modules/lodash/toLength.js +38 -0
- package/node_modules/lodash/toLower.js +28 -0
- package/node_modules/lodash/toNumber.js +64 -0
- package/node_modules/lodash/toPairs.js +30 -0
- package/node_modules/lodash/toPairsIn.js +30 -0
- package/node_modules/lodash/toPath.js +33 -0
- package/node_modules/lodash/toPlainObject.js +32 -0
- package/node_modules/lodash/toSafeInteger.js +37 -0
- package/node_modules/lodash/toString.js +28 -0
- package/node_modules/lodash/toUpper.js +28 -0
- package/node_modules/lodash/transform.js +65 -0
- package/node_modules/lodash/trim.js +47 -0
- package/node_modules/lodash/trimEnd.js +41 -0
- package/node_modules/lodash/trimStart.js +43 -0
- package/node_modules/lodash/truncate.js +111 -0
- package/node_modules/lodash/unary.js +22 -0
- package/node_modules/lodash/unescape.js +34 -0
- package/node_modules/lodash/union.js +26 -0
- package/node_modules/lodash/unionBy.js +39 -0
- package/node_modules/lodash/unionWith.js +34 -0
- package/node_modules/lodash/uniq.js +25 -0
- package/node_modules/lodash/uniqBy.js +31 -0
- package/node_modules/lodash/uniqWith.js +28 -0
- package/node_modules/lodash/uniqueId.js +28 -0
- package/node_modules/lodash/unset.js +34 -0
- package/node_modules/lodash/unzip.js +45 -0
- package/node_modules/lodash/unzipWith.js +39 -0
- package/node_modules/lodash/update.js +35 -0
- package/node_modules/lodash/updateWith.js +33 -0
- package/node_modules/lodash/upperCase.js +27 -0
- package/node_modules/lodash/upperFirst.js +22 -0
- package/node_modules/lodash/util.js +34 -0
- package/node_modules/lodash/value.js +1 -0
- package/node_modules/lodash/valueOf.js +1 -0
- package/node_modules/lodash/values.js +34 -0
- package/node_modules/lodash/valuesIn.js +32 -0
- package/node_modules/lodash/without.js +31 -0
- package/node_modules/lodash/words.js +35 -0
- package/node_modules/lodash/wrap.js +30 -0
- package/node_modules/lodash/wrapperAt.js +48 -0
- package/node_modules/lodash/wrapperChain.js +34 -0
- package/node_modules/lodash/wrapperLodash.js +147 -0
- package/node_modules/lodash/wrapperReverse.js +44 -0
- package/node_modules/lodash/wrapperValue.js +21 -0
- package/node_modules/lodash/xor.js +28 -0
- package/node_modules/lodash/xorBy.js +39 -0
- package/node_modules/lodash/xorWith.js +34 -0
- package/node_modules/lodash/zip.js +22 -0
- package/node_modules/lodash/zipObject.js +24 -0
- package/node_modules/lodash/zipObjectDeep.js +23 -0
- package/node_modules/lodash/zipWith.js +32 -0
- package/package.json +93 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
var _a;
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.GlueJobL3Construct = void 0;
|
|
10
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
11
|
+
|
|
12
|
+
const dataops_project_l3_construct_1 = require("@aws-mdaa/dataops-project-l3-construct");
|
|
13
|
+
const eventbridge_helper_1 = require("@aws-mdaa/eventbridge-helper");
|
|
14
|
+
const glue_constructs_1 = require("@aws-mdaa/glue-constructs");
|
|
15
|
+
const iam_constructs_1 = require("@aws-mdaa/iam-constructs");
|
|
16
|
+
const s3_constructs_1 = require("@aws-mdaa/s3-constructs");
|
|
17
|
+
const l3_construct_1 = require("@aws-mdaa/l3-construct");
|
|
18
|
+
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
19
|
+
const construct_1 = require("@aws-mdaa/construct"); //NOSONAR
|
|
20
|
+
const path = require("path");
|
|
21
|
+
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
|
|
22
|
+
const sns_constructs_1 = require("@aws-mdaa/sns-constructs");
|
|
23
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
24
|
+
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
25
|
+
const cloudwatch_constructs_1 = require("@aws-mdaa/cloudwatch-constructs");
|
|
26
|
+
const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
27
|
+
const utils_1 = require("@aws-mdaa/cloudwatch-constructs/lib/utils");
|
|
28
|
+
class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
29
|
+
constructor(scope, id, props) {
|
|
30
|
+
super(scope, id, props);
|
|
31
|
+
this.props = props;
|
|
32
|
+
if (!this.props.deploymentRoleArn) {
|
|
33
|
+
throw new Error('Deployment role ARN is required for job configuration');
|
|
34
|
+
}
|
|
35
|
+
const deploymentRole = iam_constructs_1.MdaaRole.fromRoleArn(this.scope, `deployment-role`, this.props.deploymentRoleArn);
|
|
36
|
+
if (!this.props.projectBucketName) {
|
|
37
|
+
throw new Error('Project bucket name is required for job configuration');
|
|
38
|
+
}
|
|
39
|
+
const projectBucket = s3_constructs_1.MdaaBucket.fromBucketName(this.scope, `project-bucket`, this.props.projectBucketName);
|
|
40
|
+
if (!this.props.projectKMSArn) {
|
|
41
|
+
throw new Error('Project KMS Key is required for job configuration');
|
|
42
|
+
}
|
|
43
|
+
this.projectKmsKey = aws_kms_1.Key.fromKeyArn(this, this.props.projectName, this.props.projectKMSArn);
|
|
44
|
+
// Build our jobs!
|
|
45
|
+
const allJobs = this.props.jobConfigs;
|
|
46
|
+
Object.keys(allJobs).forEach(jobName => {
|
|
47
|
+
const jobConfig = allJobs[jobName];
|
|
48
|
+
this.createJob(jobName, jobConfig, deploymentRole, projectBucket);
|
|
49
|
+
});
|
|
50
|
+
//CDK S3 Deployment automatically adds inline policy to project deployment role.
|
|
51
|
+
this.scope.node.children.forEach(child => {
|
|
52
|
+
if (child.node.id.startsWith('deployment-role')) {
|
|
53
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [
|
|
54
|
+
{ id: 'AwsSolutions-IAM5', reason: 'Inline policy used only for deployment.' },
|
|
55
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
56
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
57
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
58
|
+
], true);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, deploymentId, deploymentPath, extract) {
|
|
63
|
+
// Deploy Source asset(s) to /deployment/libs/<job> location.
|
|
64
|
+
return new aws_s3_deployment_1.BucketDeployment(this.scope, deploymentId, {
|
|
65
|
+
sources: additionalFilesSources,
|
|
66
|
+
destinationBucket: projectBucket,
|
|
67
|
+
destinationKeyPrefix: deploymentPath,
|
|
68
|
+
role: deploymentRole,
|
|
69
|
+
extract: extract,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
addAdditionalScripts(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
|
|
73
|
+
if (jobConfig.additionalScripts) {
|
|
74
|
+
/**
|
|
75
|
+
* Group all files at parent directory level. This will allow creating zip lib assests at various directory levels
|
|
76
|
+
* ex. '/main/script1.py' , '/util/script2.py' , '/util/script3.py' will create 2 zip files representing 'main' and 'utils'
|
|
77
|
+
* */
|
|
78
|
+
const directoryToFile = {};
|
|
79
|
+
jobConfig.additionalScripts.forEach(fileLocation => {
|
|
80
|
+
const filePath = path.dirname(fileLocation.trim());
|
|
81
|
+
if (filePath in directoryToFile) {
|
|
82
|
+
directoryToFile[filePath].push(`!${path.basename(fileLocation.trim())}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
directoryToFile[filePath] = [`!${path.basename(fileLocation.trim())}`];
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// Create Source asset for each directory
|
|
89
|
+
const additionalFilesSources = Object.entries(directoryToFile).map(([filePath, fileNames]) => {
|
|
90
|
+
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', ...fileNames] });
|
|
91
|
+
});
|
|
92
|
+
const deploymentPath = `deployment/libs/${jobName}`;
|
|
93
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, deploymentPath, `job-deployment-${jobName}-additional-script`, false);
|
|
94
|
+
// Extract zip name(s) for each source and create comma separated list of s3 locations
|
|
95
|
+
const libraryZipNames = [];
|
|
96
|
+
for (let i = 0; i < additionalFilesSources.length; i++) {
|
|
97
|
+
const libName = aws_cdk_lib_1.Fn.select(i, additionalFileDeployment.objectKeys); // Extract file name of zip containing additional scripts
|
|
98
|
+
libraryZipNames.push(`s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${libName}`);
|
|
99
|
+
}
|
|
100
|
+
// Add comma separated list of zip file names to default arguments.
|
|
101
|
+
if (defaultArguments['--extra-py-files']) {
|
|
102
|
+
defaultArguments['--extra-py-files'] += ',' + libraryZipNames.join(',');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
defaultArguments['--extra-py-files'] = libraryZipNames.join(',');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
addAdditionalJars(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
|
|
110
|
+
if (jobConfig.additionalJars) {
|
|
111
|
+
// Create Source asset for each directory
|
|
112
|
+
const additionalFilesSources = jobConfig.additionalJars.map(fullFileName => {
|
|
113
|
+
const filePath = path.dirname(fullFileName.trim());
|
|
114
|
+
const fileName = path.basename(fullFileName.trim());
|
|
115
|
+
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
|
|
116
|
+
});
|
|
117
|
+
const deploymentPath = `deployment/libs/${jobName}`;
|
|
118
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, `job-deployment-${jobName}-additional-jar`, deploymentPath, true);
|
|
119
|
+
const extraJarNames = jobConfig.additionalJars.map(fullFileName => {
|
|
120
|
+
const fileName = path.basename(fullFileName.trim());
|
|
121
|
+
return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
|
|
122
|
+
});
|
|
123
|
+
// Add comma separated list of zip file names to default arguments.
|
|
124
|
+
if (defaultArguments['--extra-jars']) {
|
|
125
|
+
defaultArguments['--extra-jars'] += ',' + extraJarNames.join(',');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
defaultArguments['--extra-jars'] = extraJarNames.join(',');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
addAdditionalFiles(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
|
|
133
|
+
if (jobConfig.additionalFiles) {
|
|
134
|
+
// Create Source asset for each directory
|
|
135
|
+
const additionalFilesSources = jobConfig.additionalFiles.map(fullFileName => {
|
|
136
|
+
const filePath = path.dirname(fullFileName.trim());
|
|
137
|
+
const fileName = path.basename(fullFileName.trim());
|
|
138
|
+
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
|
|
139
|
+
});
|
|
140
|
+
const deploymentPath = `deployment/files/${jobName}`;
|
|
141
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, `job-deployment-${jobName}-additional-file`, deploymentPath, true);
|
|
142
|
+
const extraFileNames = jobConfig.additionalFiles.map(fullFileName => {
|
|
143
|
+
const fileName = path.basename(fullFileName.trim());
|
|
144
|
+
return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
|
|
145
|
+
});
|
|
146
|
+
// Add comma separated list of zip file names to default arguments.
|
|
147
|
+
if (defaultArguments['--extra-files']) {
|
|
148
|
+
defaultArguments['--extra-files'] += ',' + extraFileNames.join(',');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
defaultArguments['--extra-files'] = extraFileNames.join(',');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
createJob(jobName, jobConfig, deploymentRole, projectBucket) {
|
|
156
|
+
const defaultArguments = jobConfig.defaultArguments ? jobConfig.defaultArguments : {};
|
|
157
|
+
const scriptPath = path.dirname(jobConfig.command.scriptLocation.trim());
|
|
158
|
+
const scriptName = path.basename(jobConfig.command.scriptLocation.trim());
|
|
159
|
+
const scriptSource = aws_s3_deployment_1.Source.asset(scriptPath, { exclude: ['**', `!${scriptName}`] });
|
|
160
|
+
const scriptDeploymentPath = `deployment/jobs/${jobName}`;
|
|
161
|
+
const scriptDeployment = new aws_s3_deployment_1.BucketDeployment(this.scope, `job-deployment-${jobName}`, {
|
|
162
|
+
sources: [scriptSource],
|
|
163
|
+
destinationBucket: projectBucket,
|
|
164
|
+
destinationKeyPrefix: scriptDeploymentPath,
|
|
165
|
+
role: deploymentRole,
|
|
166
|
+
extract: true,
|
|
167
|
+
});
|
|
168
|
+
this.addAdditionalScripts(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
|
|
169
|
+
this.addAdditionalJars(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
|
|
170
|
+
this.addAdditionalFiles(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
|
|
171
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(this.scope, [
|
|
172
|
+
{ id: 'AwsSolutions-L1', reason: 'Function is used only as custom resource during CDK deployment.' },
|
|
173
|
+
{
|
|
174
|
+
id: 'NIST.800.53.R5-LambdaConcurrency',
|
|
175
|
+
reason: 'Function is used only as custom resource during CDK deployment.',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'NIST.800.53.R5-LambdaInsideVPC',
|
|
179
|
+
reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'NIST.800.53.R5-LambdaDLQ',
|
|
183
|
+
reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: 'HIPAA.Security-LambdaConcurrency',
|
|
187
|
+
reason: 'Function is used only as custom resource during CDK deployment.',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: 'PCI.DSS.321-LambdaConcurrency',
|
|
191
|
+
reason: 'Function is used only as custom resource during CDK deployment.',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: 'HIPAA.Security-LambdaInsideVPC',
|
|
195
|
+
reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 'PCI.DSS.321-LambdaInsideVPC',
|
|
199
|
+
reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: 'HIPAA.Security-LambdaDLQ',
|
|
203
|
+
reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'PCI.DSS.321-LambdaDLQ',
|
|
207
|
+
reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
|
|
208
|
+
},
|
|
209
|
+
], true);
|
|
210
|
+
// Connections will require an array of references where they are defined
|
|
211
|
+
let connectionsConfigured;
|
|
212
|
+
if (jobConfig.connections) {
|
|
213
|
+
connectionsConfigured = {
|
|
214
|
+
connections: jobConfig.connections,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
defaultArguments['--TempDir'] = `s3://${this.props.projectBucketName}/temp/jobs/${jobName}`;
|
|
218
|
+
// add continuous logging unless explicitly disabled
|
|
219
|
+
if (jobConfig.continuousLogging) {
|
|
220
|
+
const logGroupName = jobName;
|
|
221
|
+
const logGroupNamePathPrefix = '/aws/glue';
|
|
222
|
+
defaultArguments['--continuous-log-logGroup'] = this.createLogGroup(logGroupNamePathPrefix, logGroupName, jobConfig.continuousLogging);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
console.log(`Continuous logging not enabled for job: ${jobName}`);
|
|
226
|
+
}
|
|
227
|
+
const inputParams = defaultArguments['--input_params'];
|
|
228
|
+
if (inputParams) {
|
|
229
|
+
defaultArguments['--input_params'] = JSON.stringify(inputParams);
|
|
230
|
+
}
|
|
231
|
+
if (!this.props.securityConfigurationName) {
|
|
232
|
+
throw new Error('Security configuration name is required for job monitoring event rule');
|
|
233
|
+
}
|
|
234
|
+
const job = new glue_constructs_1.MdaaCfnJob(this.scope, `${jobName}-job`, {
|
|
235
|
+
command: {
|
|
236
|
+
name: jobConfig.command.name,
|
|
237
|
+
pythonVersion: jobConfig.command.pythonVersion,
|
|
238
|
+
scriptLocation: `s3://${scriptDeployment.deployedBucket.bucketName}/${scriptDeploymentPath}/${scriptName}`,
|
|
239
|
+
},
|
|
240
|
+
role: jobConfig.executionRoleArn,
|
|
241
|
+
allocatedCapacity: jobConfig.allocatedCapacity,
|
|
242
|
+
connections: connectionsConfigured,
|
|
243
|
+
defaultArguments: defaultArguments,
|
|
244
|
+
description: jobConfig.description,
|
|
245
|
+
executionProperty: jobConfig.executionProperty,
|
|
246
|
+
glueVersion: jobConfig.glueVersion,
|
|
247
|
+
maxCapacity: jobConfig.maxCapacity,
|
|
248
|
+
maxRetries: jobConfig.maxRetries,
|
|
249
|
+
name: jobName,
|
|
250
|
+
notificationProperty: jobConfig.notificationProperty,
|
|
251
|
+
numberOfWorkers: jobConfig.numberOfWorkers,
|
|
252
|
+
securityConfiguration: this.props.securityConfigurationName,
|
|
253
|
+
timeout: jobConfig.timeout,
|
|
254
|
+
workerType: jobConfig.workerType,
|
|
255
|
+
naming: this.props.naming,
|
|
256
|
+
});
|
|
257
|
+
if (job.name) {
|
|
258
|
+
dataops_project_l3_construct_1.DataOpsProjectUtils.createProjectSSMParam(this.scope, this.props.naming, this.props.projectName, `job/name/${jobName}`, job.name);
|
|
259
|
+
const eventRule = this.createJobMonitoringEventRule(`${jobName}-monitor`, [job.name]);
|
|
260
|
+
if (!this.props.notificationTopicArn) {
|
|
261
|
+
throw new Error('Notification topic ARN is required for job monitoring event rule');
|
|
262
|
+
}
|
|
263
|
+
eventRule.addTarget(new aws_events_targets_1.SnsTopic(sns_constructs_1.MdaaSnsTopic.fromTopicArn(this.scope, `${jobName}-topic`, this.props.notificationTopicArn)));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
createJobMonitoringEventRule(ruleName, jobNames) {
|
|
267
|
+
return eventbridge_helper_1.EventBridgeHelper.createGlueMonitoringEventRule(this.scope, this.props.naming, ruleName, 'Workflow Job failure events', {
|
|
268
|
+
jobName: jobNames,
|
|
269
|
+
state: ['FAILED', 'TIMEOUT', 'STOPPED'],
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
createLogGroup(logGroupNamePathPrefix, logGroupName, loggingConfig) {
|
|
273
|
+
let logGroupRetentionDays;
|
|
274
|
+
if (loggingConfig.logGroupRetentionDays != 0) {
|
|
275
|
+
logGroupRetentionDays = loggingConfig.logGroupRetentionDays;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
logGroupRetentionDays = aws_logs_1.RetentionDays.INFINITE;
|
|
279
|
+
}
|
|
280
|
+
const logProps = {
|
|
281
|
+
naming: this.props.naming,
|
|
282
|
+
logGroupName: logGroupName,
|
|
283
|
+
logGroupNamePathPrefix: logGroupNamePathPrefix,
|
|
284
|
+
encryptionKey: this.projectKmsKey,
|
|
285
|
+
retention: logGroupRetentionDays,
|
|
286
|
+
};
|
|
287
|
+
new cloudwatch_constructs_1.MdaaLogGroup(this, logGroupName, logProps);
|
|
288
|
+
// `updateProps` always returns a prop with a logGroupName
|
|
289
|
+
return (0, utils_1.updateProps)(logProps).logGroupName;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.GlueJobL3Construct = GlueJobL3Construct;
|
|
293
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
294
|
+
GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.2.0" };
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHFFQUF3RTtBQThVeEUsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsMEJBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUss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LElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixRQUFRLEVBQ1IsNkJBQTZCLEVBQzdCO1lBQ0UsT0FBTyxFQUFFLFFBQVE7WUFDakIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDeEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxzQkFBOEIsRUFBRSxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZHLElBQUkscUJBQW9DLENBQUM7UUFFekMsSUFBSSxhQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MscUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04scUJBQXFCLEdBQUcsd0JBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsWUFBWTtZQUMxQixzQkFBc0IsRUFBRSxzQkFBc0I7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLElBQUksb0NBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLDBEQUEwRDtRQUMxRCxPQUFPLElBQUEsbUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxZQUFhLENBQUM7SUFDN0MsQ0FBQzs7QUF2V0gsZ0RBd1dDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGF0YU9wc1Byb2plY3RVdGlscyB9IGZyb20gJ0Bhd3MtbWRhYS9kYXRhb3BzLXByb2plY3QtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlSGVscGVyIH0gZnJvbSAnQGF3cy1tZGFhL2V2ZW50YnJpZGdlLWhlbHBlcic7XG5pbXBvcnQgeyBNZGFhQ2ZuSm9iIH0gZnJvbSAnQGF3cy1tZGFhL2dsdWUtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhQnVja2V0IH0gZnJvbSAnQGF3cy1tZGFhL3MzLWNvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWRhYUwzQ29uc3RydWN0LCBNZGFhTDNDb25zdHJ1Y3RQcm9wcyB9IGZyb20gJ0Bhd3MtbWRhYS9sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgSVNvdXJjZSwgU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgTWRhYU5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ0Bhd3MtbWRhYS9jb25zdHJ1Y3QnOyAvL05PU09OQVJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNuc1RvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1kYWFTbnNUb3BpYyB9IGZyb20gJ0Bhd3MtbWRhYS9zbnMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FbGVtZW50IH0gZnJvbSAnQGF3cy1tZGFhL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgTWRhYUxvZ0dyb3VwIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG5leHBvcnQgdHlwZSBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbiA9ICcyJyB8ICczJyB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmROYW1lID0gJ2dsdWVldGwnIHwgJ3B5dGhvbnNoZWxsJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGxvZ2dpbmcgd2l0aCBDbG91ZFdhdGNoIGxvZyByZXRlbnRpb24gbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgbG9nIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgZW5zdXJpbmcgcHJvcGVyIGxvZyBtYW5hZ2VtZW50LCBjb21wbGlhbmNlLCBhbmQgY29zdCBvcHRpbWl6YXRpb24gZm9yIERhdGFPcHMgam9iIG1vbml0b3JpbmcgYW5kIGF1ZGl0IHRyYWlscy5cbiAqXG4gKiBVc2UgY2FzZXM6IExvZyByZXRlbnRpb24gbWFuYWdlbWVudDsgQ29tcGxpYW5jZSByZXF1aXJlbWVudHM7IENvc3Qgb3B0aW1pemF0aW9uOyBBdWRpdCB0cmFpbCBtYW5hZ2VtZW50XG4gKlxuICogQVdTOiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBsb2dzIGFuZCBtb25pdG9yaW5nXG4gKlxuICogVmFsaWRhdGlvbjogbG9nR3JvdXBSZXRlbnRpb25EYXlzIGlzIHJlcXVpcmVkIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIHJldGVudGlvbiBwZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcmV0ZW50aW9uIHBlcmlvZCBpbiBkYXlzIGZvciBHbHVlIGpvYiBsb2cgbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgaG93IGxvbmcgam9iIGV4ZWN1dGlvbiBsb2dzIGFyZSByZXRhaW5lZCBpbiBDbG91ZFdhdGNoIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIGxvZyByZXRlbnRpb24sIGNvbXBsaWFuY2UgbWFuYWdlbWVudCwgYW5kIHN0b3JhZ2UgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogTG9nIHJldGVudGlvbiBtYW5hZ2VtZW50OyBDb21wbGlhbmNlIHJlcXVpcmVtZW50czsgU3RvcmFnZSBjb3N0IG9wdGltaXphdGlvbjsgQXVkaXQgdHJhaWwgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IENsb3VkV2F0Y2ggbG9nIGdyb3VwIHJldGVudGlvbiBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgYW5kIGF1ZGl0IHRyYWlsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSAxLDMsNSw3LDE0LDMwLDYwLDkwLDEyMCwxNTAsMTgwLDM2NSw0MDAsNTQ1LDczMSwxODI3LDM2NTMsIG9yIDA7IHJlcXVpcmVkIGZvciBsb2cgcmV0ZW50aW9uIGNvbmZpZ3VyYXRpb25cbiAgICoqL1xuICByZWFkb25seSBsb2dHcm91cFJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGNvbW1hbmQgc3BlY2lmaWNhdGlvbiB3aXRoIHNjcmlwdCBleGVjdXRpb24gYW5kIHJ1bnRpbWUgZW52aXJvbm1lbnQgc2V0dGluZ3MuIERlZmluZXMgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgam9iIHR5cGUsIFB5dGhvbiB2ZXJzaW9uLCBhbmQgc2NyaXB0IGxvY2F0aW9uIGZvciBHbHVlIEVUTCBhbmQgUHl0aG9uIHNoZWxsIGpvYiBleGVjdXRpb24gd2l0aGluIERhdGFPcHMgd29ya2Zsb3dzLlxuICpcbiAqIFVzZSBjYXNlczogSm9iIGNvbW1hbmQgY29uZmlndXJhdGlvbjsgU2NyaXB0IGV4ZWN1dGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRVRMIGpvYiBzZXR1cFxuICpcbiAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBjb25maWd1cmF0aW9uIGZvciBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50XG4gKlxuICogVmFsaWRhdGlvbjogbmFtZSBhbmQgc2NyaXB0TG9jYXRpb24gYXJlIHJlcXVpcmVkOyBweXRob25WZXJzaW9uIGlzIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb21tYW5kIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgbmFtZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xsaW5nIEdsdWUgam9iIGV4ZWN1dGlvbiB0eXBlIGFuZCBydW50aW1lIGVudmlyb25tZW50LiBEZWZpbmVzIHdoZXRoZXIgdG8gdXNlIGdsdWVldGwgZm9yIEVUTCBqb2JzIHdpdGggU3BhcmsgcnVudGltZSBvciBweXRob25zaGVsbCBmb3IgUHl0aG9uIHNjcmlwdCBleGVjdXRpb24gd2l0aCBkaWZmZXJlbnQgcmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgY2FwYWJpbGl0aWVzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiB0eXBlIHNlbGVjdGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRXhlY3V0aW9uIG1vZGVsOyBSZXNvdXJjZSBhbGxvY2F0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBuYW1lIGZvciBleGVjdXRpb24gdHlwZSBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBzZWxlY3Rpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBnbHVlZXRsIG9yIHB5dGhvbnNoZWxsOyByZXF1aXJlZCBmb3Igam9iIGNvbW1hbmQgdHlwZSBhbmQgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAqICAgKiovXG4gIHJlYWRvbmx5IG5hbWU6IEpvYkNvbW1hbmROYW1lO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBQeXRob24gdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBydW50aW1lIGVudmlyb25tZW50IGVuYWJsaW5nIHZlcnNpb24tc3BlY2lmaWMgc2NyaXB0IGV4ZWN1dGlvbiBhbmQgY29tcGF0aWJpbGl0eS4gV2hlbiBzcGVjaWZpZWQsIGNvbnRyb2xzIHRoZSBQeXRob24gcnVudGltZSB2ZXJzaW9uIGZvciBqb2IgZXhlY3V0aW9uIGVuc3VyaW5nIHNjcmlwdCBjb21wYXRpYmlsaXR5IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBQeXRob24gdmVyc2lvbiBjb250cm9sOyBSdW50aW1lIGNvbXBhdGliaWxpdHk7IFNjcmlwdCBleGVjdXRpb247IFZlcnNpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIFB5dGhvbiB2ZXJzaW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGFuZCBzY3JpcHQgY29tcGF0aWJpbGl0eVxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIDIgb3IgMyBpZiBwcm92aWRlZDsgY29udHJvbHMgUHl0aG9uIHJ1bnRpbWUgdmVyc2lvbiBmb3Igam9iIGV4ZWN1dGlvblxuICAgKiAgICoqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogSm9iQ29tbWFuZFB5dGhvblZlcnNpb247XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIFJlcXVpcmVkIHJlbGF0aXZlIHBhdGggdG8gR2x1ZSBzY3JpcHQgZm9yIGpvYiBleGVjdXRpb24gZW5hYmxpbmcgc2NyaXB0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gYW5kIGNvZGUgZGVwbG95bWVudC4gUHJvdmlkZXMgdGhlIFMzIHBhdGggb3IgcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIEdsdWUgc2NyaXB0IHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgam9iIGZvciBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgbG9jYXRpb247IENvZGUgZGVwbG95bWVudDsgSm9iIGV4ZWN1dGlvbjsgRVRMIHByb2Nlc3NpbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBzY3JpcHQgbG9jYXRpb24gZm9yIGNvZGUgZXhlY3V0aW9uIGFuZCBFVEwgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHNjcmlwdCBwYXRoOyByZXF1aXJlZCBmb3Igam9iIHNjcmlwdCBsb2NhdGlvbiBhbmQgY29kZSBleGVjdXRpb25cbiAgICoqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIHByb3BlcnRpZXMgcHJvdmlkaW5nIEVUTCBqb2IgY29uZmlndXJhdGlvbiBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuIERlZmluZXMgY29tcGxldGUgR2x1ZSBqb2Igc2V0dXAgaW5jbHVkaW5nIGV4ZWN1dGlvbiByb2xlcywgY29tbWFuZHMsIGNhcGFjaXR5IGFsbG9jYXRpb24sIHJldHJ5IHBvbGljaWVzLCBhbmQgbW9uaXRvcmluZyBmb3IgRGF0YU9wcyBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbiB3b3JrZmxvd3MuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBleGVjdXRpb24gcm9sZSBBUk4gZm9yIEdsdWUgam9iIHBlcm1pc3Npb25zIGVuYWJsaW5nIHNlY3VyZSBqb2IgZXhlY3V0aW9uIGFuZCBBV1Mgc2VydmljZSBhY2Nlc3MuIFByb3ZpZGVzIHRoZSBJQU0gcm9sZSB0aGF0IHRoZSBHbHVlIGpvYiB3aWxsIGFzc3VtZSBmb3IgZXhlY3V0aW5nIEVUTCBvcGVyYXRpb25zIGFuZCBhY2Nlc3NpbmcgQVdTIHNlcnZpY2VzIGR1cmluZyBkYXRhIHByb2Nlc3Npbmcgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBwZXJtaXNzaW9uczsgU2VydmljZSBhY2Nlc3M7IFNlY3VyZSBleGVjdXRpb247IElBTSByb2xlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBJQU0gcm9sZSBBUk4gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBwZXJtaXNzaW9ucyBhbmQgc2VydmljZSBhY2Nlc3NcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBJQU0gcm9sZSBBUk47IHJlcXVpcmVkIGZvciBqb2IgZXhlY3V0aW9uIHBlcm1pc3Npb25zIGFuZCBzZXJ2aWNlIGFjY2Vzc1xuICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBkZWZpbmluZyBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50IGZvciBHbHVlIGpvYiBwcm9jZXNzaW5nLiBQcm92aWRlcyB0aGUgY29tbWFuZCBzcGVjaWZpY2F0aW9uIGluY2x1ZGluZyBqb2IgdHlwZSwgUHl0aG9uIHZlcnNpb24sIGFuZCBzY3JpcHQgbG9jYXRpb24gZm9yIEVUTCBqb2IgZXhlY3V0aW9uIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFNjcmlwdCBleGVjdXRpb247IFJ1bnRpbWUgY29uZmlndXJhdGlvbjsgSm9iIGNvbW1hbmQgc2V0dXA7IEVUTCBwcm9jZXNzaW5nXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBmb3Igc2NyaXB0IGV4ZWN1dGlvbiBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgSm9iQ29tbWFuZDsgcmVxdWlyZWQgZm9yIGpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gYW5kIHNjcmlwdCBleGVjdXRpb25cbiAgICogICAqKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogSm9iQ29tbWFuZDtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciBqb2IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBlbmFibGluZyByZXVzYWJsZSBqb2IgY29uZmlndXJhdGlvbnMgYW5kIHN0YW5kYXJkaXplZCBzZXR1cHMuIFdoZW4gc3BlY2lmaWVkLCBpbmhlcml0cyBjb25maWd1cmF0aW9uIGZyb20gYSB0ZW1wbGF0ZSBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgY29uc2lzdGVudCBqb2Igc2V0dXAgYW5kIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uZmlndXJhdGlvbiBpbmhlcml0YW5jZTsgVGVtcGxhdGUgcmV1c2U7IFN0YW5kYXJkaXplZCBzZXR1cDsgQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50XG4gICAqXG4gICAqIEFXUzogSm9iIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBhbmQgc3RhbmRhcmRpemVkIGpvYiBzZXR1cFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHRlbXBsYXRlIG5hbWUgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBmcm9tIGRlZmluZWQgdGVtcGxhdGVzXG4gICAqKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFsbG9jYXRlZCBjYXBhY2l0eSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGNvbnRyb2xsaW5nIGpvYiBwZXJmb3JtYW5jZSBhbmQgY29zdCBtYW5hZ2VtZW50LiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IgZm9yIHByb2Nlc3NpbmcgcGVyZm9ybWFuY2UgYW5kIHJlc291cmNlIHV0aWxpemF0aW9uIG9wdGltaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBSZXNvdXJjZSBhbGxvY2F0aW9uOyBQZXJmb3JtYW5jZSB0dW5pbmc7IENvc3QgbWFuYWdlbWVudDsgQ2FwYWNpdHkgcGxhbm5pbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBhbGxvY2F0ZWQgY2FwYWNpdHkgZm9yIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZVxuICAgKiovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBjb25uZWN0aW9uIG5hbWVzIGZvciBHbHVlIGpvYiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBlbmFibGluZyBkYXRhYmFzZSBhbmQgZXh0ZXJuYWwgc3lzdGVtIGFjY2Vzcy4gUHJvdmlkZXMgbmV0d29yayBjb25uZWN0aW9ucyBmb3IgYWNjZXNzaW5nIGRhdGFiYXNlcywgVlBDIHJlc291cmNlcywgYW5kIGV4dGVybmFsIHN5c3RlbXMgZHVyaW5nIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIGludGVncmF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IERhdGFiYXNlIGNvbm5lY3Rpdml0eTsgVlBDIGFjY2VzczsgRXh0ZXJuYWwgc3lzdGVtIGludGVncmF0aW9uOyBOZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb25uZWN0aW9ucyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBjb25uZWN0aXZpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBjb25uZWN0aW9uIG5hbWVzIGlmIHByb3ZpZGVkOyBlbmFibGVzIGRhdGFiYXNlIGFuZCBleHRlcm5hbCBzeXN0ZW0gYWNjZXNzXG4gICAqKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgZGVmYXVsdCBhcmd1bWVudHMgbWFwIGZvciBHbHVlIGpvYiBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBlbmFibGluZyBqb2IgY3VzdG9taXphdGlvbiBhbmQgcnVudGltZSBiZWhhdmlvciBjb250cm9sLiBQcm92aWRlcyBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBqb2IgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBhbmQgYmVoYXZpb3IgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBKb2IgcGFyYW1ldGVyczsgUnVudGltZSBjb25maWd1cmF0aW9uOyBCZWhhdmlvciBjdXN0b21pemF0aW9uOyBQYXJhbWV0ZXIgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGRlZmF1bHQgYXJndW1lbnRzIGZvciBydW50aW1lIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlciBtYW5hZ2VtZW50XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgQ29uZmlndXJhdGlvbkVsZW1lbnQgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgam9iIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGFuZCBjdXN0b21pemF0aW9uXG4gICAqKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFyZ3VtZW50cz86IENvbmZpZ3VyYXRpb25FbGVtZW50O1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnQgZW5hYmxpbmcgam9iIGlkZW50aWZpY2F0aW9uIGFuZCBwdXJwb3NlIGRvY3VtZW50YXRpb24uIFByb3ZpZGVzIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBqb2IncyBwdXJwb3NlLCBmdW5jdGlvbmFsaXR5LCBhbmQgb3BlcmF0aW9uYWwgY2hhcmFjdGVyaXN0aWNzIGZvciBtYW5hZ2VtZW50IGFuZCBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBkb2N1bWVudGF0aW9uOyBPcGVyYXRpb25hbCBtYW5hZ2VtZW50OyBQdXJwb3NlIGlkZW50aWZpY2F0aW9uOyBNYW5hZ2VtZW50IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBkZXNjcmlwdGl2ZSB0ZXh0OyByZXF1aXJlZCBmb3Igam9iIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICoqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBleGVjdXRpb24gcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgR2x1ZSBqb2IgY29uY3VycmVuY3kgY29udHJvbCBlbmFibGluZyBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudCBhbmQgcmVzb3VyY2Ugb3B0aW1pemF0aW9uLiBEZWZpbmVzIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGluY2x1ZGluZyBtYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3Igam9iIHNjaGVkdWxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uY3VycmVuY3kgY29udHJvbDsgUGFyYWxsZWwgZXhlY3V0aW9uOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBKb2Igc2NoZWR1bGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGZvciBjb25jdXJyZW5jeSBjb250cm9sIGFuZCBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIEV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHkgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBjb25jdXJyZW5jeSBhbmQgcGFyYWxsZWwgZXhlY3V0aW9uXG4gICAqICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIEdsdWUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGNvbnRyb2wgZW5hYmxpbmcgdmVyc2lvbi1zcGVjaWZpYyBmZWF0dXJlcyBhbmQgY29tcGF0aWJpbGl0eS4gRGVmaW5lcyB0aGUgR2x1ZSBydW50aW1lIHZlcnNpb24gZm9yIGpvYiBleGVjdXRpb24gZW5zdXJpbmcgZmVhdHVyZSBhdmFpbGFiaWxpdHkgYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBqb2IgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFJ1bnRpbWUgdmVyc2lvbiBjb250cm9sOyBGZWF0dXJlIGF2YWlsYWJpbGl0eTsgQ29tcGF0aWJpbGl0eSBtYW5hZ2VtZW50OyBWZXJzaW9uIHNwZWNpZmljYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIHZlcnNpb24gZm9yIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGZlYXR1cmUgYXZhaWxhYmlsaXR5XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgR2x1ZSB2ZXJzaW9uIGlmIHByb3ZpZGVkOyBjb250cm9scyBydW50aW1lIGVudmlyb25tZW50IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGdsdWVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmljYXRpb24gZm9yIEdsdWUgam9iIHJlc291cmNlIGxpbWl0cyBjb250cm9sbGluZyBtYXhpbXVtIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIGNvc3QgbWFuYWdlbWVudC4gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgRFBVcyAoRGF0YSBQcm9jZXNzaW5nIFVuaXRzKSB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgdG8gdGhlIGpvYiBmb3IgcmVzb3VyY2UgY29udHJvbCBhbmQgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVzb3VyY2UgbGltaXRzOyBDb3N0IGNvbnRyb2w7IE1heGltdW0gYWxsb2NhdGlvbjsgUmVzb3VyY2UgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gY2FwYWNpdHkgZm9yIHJlc291cmNlIGxpbWl0cyBhbmQgY29zdCBjb250cm9sXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkOyBjb250cm9scyBtYXhpbXVtIERQVSBhbGxvY2F0aW9uIGFuZCByZXNvdXJjZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbWF4aW11bSByZXRyeSBjb3VudCBmb3IgR2x1ZSBqb2IgZmFpbHVyZSBoYW5kbGluZyBlbmFibGluZyBhdXRvbWF0aWMgcmV0cnkgYW5kIGVycm9yIHJlY292ZXJ5LiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBqb2IgZmFpbHVyZSBvY2N1cnMgZm9yIGF1dG9tYXRpYyBlcnJvciByZWNvdmVyeSBhbmQgam9iIHJlbGlhYmlsaXR5LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEVycm9yIHJlY292ZXJ5OyBBdXRvbWF0aWMgcmV0cnk7IEpvYiByZWxpYWJpbGl0eTsgRmFpbHVyZSBoYW5kbGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gcmV0cmllcyBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5IGFuZCBqb2IgcmVsaWFiaWxpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciBpZiBwcm92aWRlZDsgY29udHJvbHMgYXV0b21hdGljIHJldHJ5IGJlaGF2aW9yIGFuZCBlcnJvciByZWNvdmVyeVxuICAgKiovXG4gIHJlYWRvbmx5IG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIG5vdGlmaWNhdGlvbiBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBlbmFibGluZyBqb2Igc3RhdHVzIG5vdGlmaWNhdGlvbnMgYW5kIG9wZXJhdGlvbmFsIGF3YXJlbmVzcy4gRGVmaW5lcyBub3RpZmljYXRpb24gc2V0dGluZ3MgaW5jbHVkaW5nIG5vdGlmaWNhdGlvbiBkZWxheSBmb3Igam9iIG1vbml0b3JpbmcgYW5kIG9wZXJhdGlvbmFsIGFsZXJ0aW5nLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBtb25pdG9yaW5nOyBTdGF0dXMgbm90aWZpY2F0aW9uczsgT3BlcmF0aW9uYWwgYWxlcnRpbmc7IE1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG5vdGlmaWNhdGlvbiBwcm9wZXJ0aWVzIGZvciBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eSBpZiBwcm92aWRlZDsgZW5hYmxlcyBqb2IgbW9uaXRvcmluZyBhbmQgYWxlcnRpbmdcbiAgICogICAqKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uUHJvcGVydHk/OiBDZm5Kb2IuTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbnVtYmVyIG9mIHdvcmtlcnMgc3BlY2lmaWNhdGlvbiBmb3IgR2x1ZSBqb2IgcGFyYWxsZWwgcHJvY2Vzc2luZyBlbmFibGluZyBkaXN0cmlidXRlZCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIG51bWJlciBvZiB3b3JrZXJzIGFzc2lnbmVkIHRvIHRoZSBqb2IgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcgYW5kIGRpc3RyaWJ1dGVkIGRhdGEgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUGFyYWxsZWwgcHJvY2Vzc2luZzsgRGlzdHJpYnV0ZWQgcHJvY2Vzc2luZzsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBXb3JrZXIgYWxsb2NhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG51bWJlciBvZiB3b3JrZXJzIGZvciBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHByb3ZpZGVkOyBjb250cm9scyBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCB3b3JrZXIgYWxsb2NhdGlvblxuICAgKiovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGltZW91dCBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBleGVjdXRpb24gbGltaXRzIGVuYWJsaW5nIGpvYiBydW50aW1lIGNvbnRyb2wgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuIERlZmluZXMgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoZSBqb2IgaW4gbWludXRlcyBmb3IgcnVudGltZSBjb250cm9sIGFuZCByZXNvdXJjZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUnVudGltZSBjb250cm9sOyBFeGVjdXRpb24gbGltaXRzOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBUaW1lb3V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB0aW1lb3V0IGZvciBleGVjdXRpb24gdGltZSBsaW1pdHMgYW5kIHJlc291cmNlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGluIG1pbnV0ZXMgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBleGVjdXRpb24gdGltZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCB3b3JrZXIgdHlwZSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBjb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbiBlbmFibGluZyBwZXJmb3JtYW5jZSBhbmQgY29zdCBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIHR5cGUgb2Ygd29ya2VycyAoU3RhbmRhcmQsIEcuMVgsIEcuMlgpIGZvciBjb21wdXRlIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbjsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBDb3N0IG1hbmFnZW1lbnQ7IFdvcmtlciB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB3b3JrZXIgdHlwZSBmb3IgY29tcHV0ZSByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBTdGFuZGFyZCwgRy4xWCwgb3IgRy4yWCBpZiBwcm92aWRlZDsgY29udHJvbHMgY29tcHV0ZSByZXNvdXJjZSB0eXBlIGFuZCBwZXJmb3JtYW5jZVxuICAgKiAgICoqL1xuICByZWFkb25seSB3b3JrZXJUeXBlPzogSm9iV29ya2VyVHlwZTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgYWRkaXRpb25hbCBzY3JpcHQgcGF0aHMgZm9yIEdsdWUgam9iIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBlbmFibGluZyBtb2R1bGFyIEVUTCBkZXZlbG9wbWVudCBhbmQgY29kZSByZXVzZS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBHbHVlIHNjcmlwdHMgcmVmZXJlbmNlZCBieSB0aGUgbWFpbiBFVEwgc2NyaXB0IGZvciBtb2R1bGFyIGRldmVsb3BtZW50IGFuZCBjb2RlIG9yZ2FuaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgZGVwZW5kZW5jaWVzOyBNb2R1bGFyIGRldmVsb3BtZW50OyBDb2RlIHJldXNlOyBEZXBlbmRlbmN5IG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIEdsdWUgc2NyaXB0cyBmb3Igam9iIGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBFVEwgZGV2ZWxvcG1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBzY3JpcHQgcGF0aHMgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgc2NyaXB0IGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBkZXZlbG9wbWVudFxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxTY3JpcHRzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgSkFSIGZpbGUgcGF0aHMgZm9yIEdsdWUgam9iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gSkFSIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgcHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogSmF2YSBsaWJyYXJ5IGludGVncmF0aW9uOyBFeHRlbmRlZCBmdW5jdGlvbmFsaXR5OyBMaWJyYXJ5IGRlcGVuZGVuY2llczsgSkFSIGZpbGUgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciBHbHVlIGpvYiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBhbmQgSmF2YSBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIGFycmF5IG9mIHZhbGlkIEpBUiBmaWxlIHBhdGhzIGlmIHByb3ZpZGVkOyBlbmFibGVzIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxKYXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgZmlsZSBwYXRocyBmb3IgR2x1ZSBqb2IgcmVzb3VyY2UgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIGV4dGVybmFsIGZpbGUgYWNjZXNzIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LiBQcm92aWRlcyByZWxhdGl2ZSBwYXRocyB0byBhZGRpdGlvbmFsIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIGV4dGVybmFsIHJlc291cmNlIGFjY2VzcyBhbmQgZmlsZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRmlsZSBkZXBlbmRlbmNpZXM7IEV4dGVybmFsIHJlc291cmNlczsgUmVzb3VyY2UgbWFuYWdlbWVudDsgRmlsZSBhY2Nlc3NcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIGZpbGVzIGZvciBHbHVlIGpvYiByZXNvdXJjZSBkZXBlbmRlbmNpZXMgYW5kIGV4dGVybmFsIGZpbGUgYWNjZXNzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgZmlsZSBwYXRocyBpZiBwcm92aWRlZDsgZW5hYmxlcyBleHRlcm5hbCBmaWxlIGFjY2VzcyBhbmQgcmVzb3VyY2UgZGVwZW5kZW5jaWVzXG4gICAqKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGNvbnRpbnVvdXMgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiByZWFsLXRpbWUgbW9uaXRvcmluZyBlbmFibGluZyBsaXZlIGxvZyBzdHJlYW1pbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzdXBwb3J0LiBXaGVuIGVuYWJsZWQsIHN0cmVhbXMgam9iIGxvZ3MgdG8gQ2xvdWRXYXRjaCBMb2dzIGluIHJlYWwtdGltZSBmb3IgbGl2ZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcgZHVyaW5nIGpvYiBleGVjdXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVhbC10aW1lIG1vbml0b3Jpbmc7IExpdmUgbG9nIHN0cmVhbWluZzsgVHJvdWJsZXNob290aW5nIHN1cHBvcnQ7IE9wZXJhdGlvbmFsIHZpc2liaWxpdHlcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb250aW51b3VzIGxvZ2dpbmcgZm9yIHJlYWwtdGltZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmdcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBMb2dnaW5nQ29uZmlnIGlmIHByb3ZpZGVkOyBlbmFibGVzIHJlYWwtdGltZSBsb2cgc3RyZWFtaW5nIGFuZCBtb25pdG9yaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgY29udGludW91c0xvZ2dpbmc/OiBMb2dnaW5nQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdsdWVKb2JMM0NvbnN0cnVjdFByb3BzIGV4dGVuZHMgTWRhYUwzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogUm9sZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGVwbG95IHRoZSBKb2IgY29kZS4gU2hvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIERhdGFPcHMgUHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGVBcm4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgRGF0YSBPcHMgcHJvamVjdCBidWNrZXQgd2hlcmUgam9iIHJlc291cmNlcyB3aWxsIGJlIGRlcGxveWVkIGFuZCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgam9iIGxvY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0QnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gdG9waWMgQXJuXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpY0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YW9wcyBwcm9qZWN0IEtNUyBrZXkgQVJOLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEtNU0Fybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdsdWVKb2JMM0NvbnN0cnVjdCBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEttc0tleTogSUtleTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuZGVwbG95bWVudFJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwbG95bWVudCByb2xlIEFSTiBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudFJvbGUgPSBNZGFhUm9sZS5mcm9tUm9sZUFybih0aGlzLnNjb3BlLCBgZGVwbG95bWVudC1yb2xlYCwgdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybik7XG4gICAgaWYgKCF0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgYnVja2V0IG5hbWUgaXMgcmVxdWlyZWQgZm9yIGpvYiBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RCdWNrZXQgPSBNZGFhQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMuc2NvcGUsIGBwcm9qZWN0LWJ1Y2tldGAsIHRoaXMucHJvcHMucHJvamVjdEJ1Y2tldE5hbWUpO1xuICAgIGlmICghdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgS01TIEtleSBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy5wcm9qZWN0S21zS2V5ID0gS2V5LmZyb21LZXlBcm4odGhpcywgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSwgdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKTtcblxuICAgIC8vIEJ1aWxkIG91ciBqb2JzIVxuICAgIGNvbnN0IGFsbEpvYnMgPSB0aGlzLnByb3BzLmpvYkNvbmZpZ3M7XG4gICAgT2JqZWN0LmtleXMoYWxsSm9icykuZm9yRWFjaChqb2JOYW1lID0+IHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZyA9IGFsbEpvYnNbam9iTmFtZV07XG4gICAgICB0aGlzLmNyZWF0ZUpvYihqb2JOYW1lLCBqb2JDb25maWcsIGRlcGxveW1lbnRSb2xlLCBwcm9qZWN0QnVja2V0KTtcbiAgICB9KTtcbiAgICAvL0NESyBTMyBEZXBsb3ltZW50IGF1dG9tYXRpY2FsbHkgYWRkcyBpbmxpbmUgcG9saWN5IHRvIHByb2plY3QgZGVwbG95bWVudCByb2xlLlxuICAgIHRoaXMuc2NvcGUubm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmIChjaGlsZC5ub2RlLmlkLnN0YXJ0c1dpdGgoJ2RlcGxveW1lbnQtcm9sZScpKSB7XG4gICAgICAgIE1kYWFOYWdTdXBwcmVzc2lvbnMuYWRkQ29kZVJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdOSVNULjgwMC41My5SNS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ1BvbGljeSB1c2VkIG9ubHkgZm9yIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnUG9saWN5IHVzZWQgb25seSBmb3IgZGVwbG95bWVudC4nIH0sXG4gICAgICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdQb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzOiBJU291cmNlW10sXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gICAgZGVwbG95bWVudFBhdGg6IHN0cmluZyxcbiAgICBleHRyYWN0OiBib29sZWFuLFxuICApOiBCdWNrZXREZXBsb3ltZW50IHtcbiAgICAvLyBEZXBsb3kgU291cmNlIGFzc2V0KHMpIHRvIC9kZXBsb3ltZW50L2xpYnMvPGpvYj4gbG9jYXRpb24uXG4gICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGRlcGxveW1lbnRJZCwge1xuICAgICAgc291cmNlczogYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBwcm9qZWN0QnVja2V0LFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGRlcGxveW1lbnRQYXRoLFxuICAgICAgcm9sZTogZGVwbG95bWVudFJvbGUsXG4gICAgICBleHRyYWN0OiBleHRyYWN0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsU2NyaXB0cyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogR3JvdXAgYWxsIGZpbGVzIGF0IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBjcmVhdGluZyB6aXAgbGliIGFzc2VzdHMgYXQgdmFyaW91cyBkaXJlY3RvcnkgbGV2ZWxzXG4gICAgICAgKiBleC4gJy9tYWluL3NjcmlwdDEucHknICwgJy91dGlsL3NjcmlwdDIucHknICwgJy91dGlsL3NjcmlwdDMucHknIHdpbGwgY3JlYXRlIDIgemlwIGZpbGVzIHJlcHJlc2VudGluZyAnbWFpbicgYW5kICd1dGlscydcbiAgICAgICAqICAqL1xuICAgICAgY29uc3QgZGlyZWN0b3J5VG9GaWxlOiB7IFtmaWxlUGF0aDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgam9iQ29uZmlnLmFkZGl0aW9uYWxTY3JpcHRzLmZvckVhY2goZmlsZUxvY2F0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aCBpbiBkaXJlY3RvcnlUb0ZpbGUpIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdLnB1c2goYCEke3BhdGguYmFzZW5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0b3J5VG9GaWxlW2ZpbGVQYXRoXSA9IFtgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gT2JqZWN0LmVudHJpZXMoZGlyZWN0b3J5VG9GaWxlKS5tYXAoKFtmaWxlUGF0aCwgZmlsZU5hbWVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCAuLi5maWxlTmFtZXNdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgcHJvamVjdEJ1Y2tldCxcbiAgICAgICAgZGVwbG95bWVudFJvbGUsXG4gICAgICAgIGRlcGxveW1lbnRQYXRoLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLXNjcmlwdGAsXG4gICAgICAgIGZhbHNlLCAvLyBHbHVlIGV4cGVjdHMgemlwIG9mIGFkZGl0aW9uYWwgc2NyaXB0cywgaGVuY2UgZGlzYWJsaW5nIHRoZSBleHRyYWN0aW9uXG4gICAgICApO1xuXG4gICAgICAvLyBFeHRyYWN0IHppcCBuYW1lKHMpIGZvciBlYWNoIHNvdXJjZSBhbmQgY3JlYXRlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHMzIGxvY2F0aW9uc1xuICAgICAgY29uc3QgbGlicmFyeVppcE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGliTmFtZSA9IEZuLnNlbGVjdChpLCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQub2JqZWN0S2V5cyk7IC8vIEV4dHJhY3QgZmlsZSBuYW1lIG9mIHppcCBjb250YWluaW5nIGFkZGl0aW9uYWwgc2NyaXB0c1xuICAgICAgICBsaWJyYXJ5WmlwTmFtZXMucHVzaChgczM6Ly8ke2FkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke2RlcGxveW1lbnRQYXRofS8ke2xpYk5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB6aXAgZmlsZSBuYW1lcyB0byBkZWZhdWx0IGFyZ3VtZW50cy5cbiAgICAgIGlmIChkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1weS1maWxlcyddICs9ICcsJyArIGxpYnJhcnlaaXBOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBsaWJyYXJ5WmlwTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEphcnMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIHByb2plY3RCdWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxKYXJzKSB7XG4gICAgICAvLyBDcmVhdGUgU291cmNlIGFzc2V0IGZvciBlYWNoIGRpcmVjdG9yeVxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVzU291cmNlcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBwcm9qZWN0QnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1qYXJgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dHJhSmFyTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10gKz0gJywnICsgZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSA9IGV4dHJhSmFyTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEZpbGVzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBwcm9qZWN0QnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMpIHtcbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gam9iQ29uZmlnLmFkZGl0aW9uYWxGaWxlcy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2ZpbGVzLyR7am9iTmFtZX1gO1xuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVEZXBsb3ltZW50ID0gdGhpcy5kZXBsb3lBZGRpdGlvbmFsRmlsZXMoXG4gICAgICAgIGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMsXG4gICAgICAgIHByb2plY3RCdWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLWZpbGVgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBleHRyYUZpbGVOYW1lcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddKSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSArPSAnLCcgKyBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gPSBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2Ioam9iTmFtZTogc3RyaW5nLCBqb2JDb25maWc6IEpvYkNvbmZpZywgZGVwbG95bWVudFJvbGU6IElSb2xlLCBwcm9qZWN0QnVja2V0OiBJQnVja2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdEFyZ3VtZW50cyA9IGpvYkNvbmZpZy5kZWZhdWx0QXJndW1lbnRzID8gam9iQ29uZmlnLmRlZmF1bHRBcmd1bWVudHMgOiB7fTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5kaXJuYW1lKGpvYkNvbmZpZy5jb21tYW5kLnNjcmlwdExvY2F0aW9uLnRyaW0oKSk7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IHBhdGguYmFzZW5hbWUoam9iQ29uZmlnLmNvbW1hbmQuc2NyaXB0TG9jYXRpb24udHJpbSgpKTtcbiAgICBjb25zdCBzY3JpcHRTb3VyY2UgPSBTb3VyY2UuYXNzZXQoc2NyaXB0UGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke3NjcmlwdE5hbWV9YF0gfSk7XG5cbiAgICBjb25zdCBzY3JpcHREZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2pvYnMvJHtqb2JOYW1lfWA7XG4gICAgY29uc3Qgc2NyaXB0RGVwbG95bWVudCA9IG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGBqb2ItZGVwbG95bWVudC0ke2pvYk5hbWV9YCwge1xuICAgICAgc291cmNlczogW3NjcmlwdFNvdXJjZV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcHJvamVjdEJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzY3JpcHREZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQWRkaXRpb25hbFNjcmlwdHMoam9iTmFtZSwgam9iQ29uZmlnLCBwcm9qZWN0QnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsSmFycyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxGaWxlcyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBbXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLCByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1BDSS5EU1MuMzIxLUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIC8vIENvbm5lY3Rpb25zIHdpbGwgcmVxdWlyZSBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHdoZXJlIHRoZXkgYXJlIGRlZmluZWRcbiAgICBsZXQgY29ubmVjdGlvbnNDb25maWd1cmVkOiBDb25maWd1cmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoam9iQ29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uc0NvbmZpZ3VyZWQgPSB7XG4gICAgICAgIGNvbm5lY3Rpb25zOiBqb2JDb25maWcuY29ubmVjdGlvbnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tVGVtcERpciddID0gYHMzOi8vJHt0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lfS90ZW1wL2pvYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAvLyBhZGQgY29udGludW91cyBsb2dnaW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYgKGpvYkNvbmZpZy5jb250aW51b3VzTG9nZ2luZykge1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lID0gam9iTmFtZTtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXggPSAnL2F3cy9nbHVlJztcbiAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tY29udGludW91cy1sb2ctbG9nR3JvdXAnXSA9IHRoaXMuY3JlYXRlTG9nR3JvdXAoXG4gICAgICAgIGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXgsXG4gICAgICAgIGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYENvbnRpbnVvdXMgbG9nZ2luZyBub3QgZW5hYmxlZCBmb3Igam9iOiAke2pvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddO1xuICAgIGlmIChpbnB1dFBhcmFtcykge1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1pbnB1dF9wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VjdXJpdHkgY29uZmlndXJhdGlvbiBuYW1lIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGpvYiA9IG5ldyBNZGFhQ2ZuSm9iKHRoaXMuc2NvcGUsIGAke2pvYk5hbWV9LWpvYmAsIHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogam9iQ29uZmlnLmNvbW1hbmQubmFtZSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogam9iQ29uZmlnLmNvbW1hbmQucHl0aG9uVmVyc2lvbixcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IGBzMzovLyR7c2NyaXB0RGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke3NjcmlwdERlcGxveW1lbnRQYXRofS8ke3NjcmlwdE5hbWV9YCxcbiAgICAgIH0sXG4gICAgICByb2xlOiBqb2JDb25maWcuZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIGFsbG9jYXRlZENhcGFjaXR5OiBqb2JDb25maWcuYWxsb2NhdGVkQ2FwYWNpdHksXG4gICAgICBjb25uZWN0aW9uczogY29ubmVjdGlvbnNDb25maWd1cmVkLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50czogZGVmYXVsdEFyZ3VtZW50cyxcbiAgICAgIGRlc2NyaXB0aW9uOiBqb2JDb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLmV4ZWN1dGlvblByb3BlcnR5LFxuICAgICAgZ2x1ZVZlcnNpb246IGpvYkNvbmZpZy5nbHVlVmVyc2lvbixcbiAgICAgIG1heENhcGFjaXR5OiBqb2JDb25maWcubWF4Q2FwYWNpdHksXG4gICAgICBtYXhSZXRyaWVzOiBqb2JDb25maWcubWF4UmV0cmllcyxcbiAgICAgIG5hbWU6IGpvYk5hbWUsXG4gICAgICBub3RpZmljYXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLm5vdGlmaWNhdGlvblByb3BlcnR5LFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBqb2JDb25maWcubnVtYmVyT2ZXb3JrZXJzLFxuICAgICAgc2VjdXJpdHlDb25maWd1cmF0aW9uOiB0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICB0aW1lb3V0OiBqb2JDb25maWcudGltZW91dCxcbiAgICAgIHdvcmtlclR5cGU6IGpvYkNvbmZpZy53b3JrZXJUeXBlLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICB9KTtcbiAgICBpZiAoam9iLm5hbWUpIHtcbiAgICAgIERhdGFPcHNQcm9qZWN0VXRpbHMuY3JlYXRlUHJvamVjdFNTTVBhcmFtKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgICAgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgYGpvYi9uYW1lLyR7am9iTmFtZX1gLFxuICAgICAgICBqb2IubmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV2ZW50UnVsZSA9IHRoaXMuY3JlYXRlSm9iTW9uaXRvcmluZ0V2ZW50UnVsZShgJHtqb2JOYW1lfS1tb25pdG9yYCwgW2pvYi5uYW1lXSk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gdG9waWMgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgICB9XG4gICAgICBldmVudFJ1bGUuYWRkVGFyZ2V0KFxuICAgICAgICBuZXcgU25zVG9waWMoTWRhYVNuc1RvcGljLmZyb21Ub3BpY0Fybih0aGlzLnNjb3BlLCBgJHtqb2JOYW1lfS10b3BpY2AsIHRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKHJ1bGVOYW1lOiBzdHJpbmcsIGpvYk5hbWVzOiBzdHJpbmdbXSk6IFJ1bGUge1xuICAgIHJldHVybiBFdmVudEJyaWRnZUhlbHBlci5jcmVhdGVHbHVlTW9uaXRvcmluZ0V2ZW50UnVsZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIHJ1bGVOYW1lLFxuICAgICAgJ1dvcmtmbG93IEpvYiBmYWlsdXJlIGV2ZW50cycsXG4gICAgICB7XG4gICAgICAgIGpvYk5hbWU6IGpvYk5hbWVzLFxuICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnVElNRU9VVCcsICdTVE9QUEVEJ10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvZ0dyb3VwKGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IHN0cmluZywgbG9nR3JvdXBOYW1lOiBzdHJpbmcsIGxvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBsb2dHcm91cFJldGVudGlvbkRheXM6IFJldGVudGlvbkRheXM7XG5cbiAgICBpZiAobG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXMgIT0gMCkge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gbG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyA9IFJldGVudGlvbkRheXMuSU5GSU5JVEU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nUHJvcHMgPSB7XG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICBsb2dHcm91cE5hbWVQYXRoUHJlZml4OiBsb2dHcm91cE5hbWVQYXRoUHJlZml4LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5wcm9qZWN0S21zS2V5LFxuICAgICAgcmV0ZW50aW9uOiBsb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgfTtcbiAgICBuZXcgTWRhYUxvZ0dyb3VwKHRoaXMsIGxvZ0dyb3VwTmFtZSwgbG9nUHJvcHMpO1xuICAgIC8vIGB1cGRhdGVQcm9wc2AgYWx3YXlzIHJldHVybnMgYSBwcm9wIHdpdGggYSBsb2dHcm91cE5hbWVcbiAgICByZXR1cm4gdXBkYXRlUHJvcHMobG9nUHJvcHMpLmxvZ0dyb3VwTmFtZSE7XG4gIH1cbn1cbiJdfQ==
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
__exportStar(require("./dataops-job-l3-construct"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsNkRBQTJDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9kYXRhb3BzLWpvYi1sMy1jb25zdHJ1Y3QnO1xuIl19
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# S3 Bucket Policy Helper
|
|
2
|
+
|
|
3
|
+
This is a helper class that helps construct working S3 Bucket policy statements that can be added to a bucket construct.
|
|
4
|
+
|
|
5
|
+
## Class RestrictObjectPrefixToRoles
|
|
6
|
+
|
|
7
|
+
This helper class helps construct a working policy that allows a group of Roles to access to an object prefix in S3.
|
|
8
|
+
|
|
9
|
+
Depending on the values provided, it will produce two PolicyStatement types accessible by methods.
|
|
10
|
+
|
|
11
|
+
One for Read access to an object prefix that generally resolves to:
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
- Action: s3:GetObject*
|
|
15
|
+
Condition:
|
|
16
|
+
StringLike:
|
|
17
|
+
aws:userId:
|
|
18
|
+
- AROA12345678:*
|
|
19
|
+
Effect: Allow
|
|
20
|
+
Principal: "*"
|
|
21
|
+
Resource:
|
|
22
|
+
Fn::Join:
|
|
23
|
+
- ""
|
|
24
|
+
- - Fn::GetAtt:
|
|
25
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
26
|
+
- Arn
|
|
27
|
+
- /inventory/*
|
|
28
|
+
Sid: inventory/Read
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
One for write access to an object prefix that generally resolves to:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
- Action:
|
|
35
|
+
- s3:GetObject*
|
|
36
|
+
- s3:PutObject*
|
|
37
|
+
- s3:DeleteObject*
|
|
38
|
+
Condition:
|
|
39
|
+
StringLike:
|
|
40
|
+
aws:userId:
|
|
41
|
+
- AROA12345678:*
|
|
42
|
+
Effect: Allow
|
|
43
|
+
Principal: "*"
|
|
44
|
+
Resource:
|
|
45
|
+
Fn::Join:
|
|
46
|
+
- ""
|
|
47
|
+
- - Fn::GetAtt:
|
|
48
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
49
|
+
- Arn
|
|
50
|
+
- /inventory/*
|
|
51
|
+
Sid: inventory/ReadWrite
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Conditionals against `aws:userId` are used to support federated roles. The `@aws-mdaa/iam-role-helper` is used to resolve the requested ARNs to AROA IDs.
|
|
55
|
+
|
|
56
|
+
## RestrictObjectPrefixToRoles example
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import {MdaaRoleResolver} from '@aws-mdaa/am-role-helper'
|
|
60
|
+
import {RestrictObjectPrefixToRoles} from '@aws-mdaa/3-bucketpolicy-helper'
|
|
61
|
+
|
|
62
|
+
const roleResolver = new MdaaRoleResolver({
|
|
63
|
+
roleArns: [
|
|
64
|
+
'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
|
|
65
|
+
'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
|
|
66
|
+
]
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
roleResolver.init().then(() => {
|
|
70
|
+
const RestrictPrefix = new RestrictObjectPrefixToRoles({
|
|
71
|
+
// bucket in this context is a constructed s3.Bucket class
|
|
72
|
+
s3Bucket: bucket,
|
|
73
|
+
s3Prefix: '/protected',
|
|
74
|
+
readRoles: [
|
|
75
|
+
'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
|
|
76
|
+
'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
|
|
77
|
+
],
|
|
78
|
+
readWriteRoles: [
|
|
79
|
+
'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access'
|
|
80
|
+
],
|
|
81
|
+
roleAroaResolver: roleResolver
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
bucket.addToResourcePolicy(RestrictPrefix.readStatement())
|
|
85
|
+
bucket.addToResourcePolicy(RestrictPrefix.readWriteStatement())
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Class RestrictBucketToRoles
|
|
90
|
+
|
|
91
|
+
Helper class to construct a policy that will restrict a bucket to a set of roles. This is realized through a Deny where source role is not on the list, and an Allow where source role is.
|
|
92
|
+
|
|
93
|
+
Depending on the values provided, it will produce two PolicyStatement types accessible by methods.
|
|
94
|
+
|
|
95
|
+
One for general bucket access that resolves to:
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
- Action:
|
|
99
|
+
- s3:List*
|
|
100
|
+
- s3:GetBucket*
|
|
101
|
+
Condition:
|
|
102
|
+
StringLike:
|
|
103
|
+
aws:userId:
|
|
104
|
+
- AROA12345678:*
|
|
105
|
+
Effect: Allow
|
|
106
|
+
Principal: "*"
|
|
107
|
+
Resource:
|
|
108
|
+
- Fn::Join:
|
|
109
|
+
- ""
|
|
110
|
+
- - Fn::GetAtt:
|
|
111
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
112
|
+
- Arn
|
|
113
|
+
- /*
|
|
114
|
+
- Fn::GetAtt:
|
|
115
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
116
|
+
- Arn
|
|
117
|
+
Sid: BucketAllow
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
One that denies access to the bucket that resolves to:
|
|
121
|
+
|
|
122
|
+
NOTE: To permit things like inventory we exclude the s3 service from the Deny statements. Also since we're using a NotPrincipal statement, we also include the root account to assure access to the bucket isn't lost if the Roles are deleted.
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
- Action:
|
|
126
|
+
- s3:PutObject*
|
|
127
|
+
- s3:GetObject*
|
|
128
|
+
- s3:List*
|
|
129
|
+
- s3:GetBucket*
|
|
130
|
+
Condition:
|
|
131
|
+
StringNotLike:
|
|
132
|
+
aws:userId:
|
|
133
|
+
- AROA12345678:*
|
|
134
|
+
Effect: Deny
|
|
135
|
+
NotPrincipal:
|
|
136
|
+
Service: s3.amazonaws.com
|
|
137
|
+
AWS:
|
|
138
|
+
Fn::Join:
|
|
139
|
+
- ""
|
|
140
|
+
- - "arn:"
|
|
141
|
+
- Ref: AWS::Partition
|
|
142
|
+
- ":iam::"
|
|
143
|
+
- Ref: AWS::AccountId
|
|
144
|
+
- :root
|
|
145
|
+
Resource:
|
|
146
|
+
- Fn::Join:
|
|
147
|
+
- ""
|
|
148
|
+
- - Fn::GetAtt:
|
|
149
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
150
|
+
- Arn
|
|
151
|
+
- /*
|
|
152
|
+
- Fn::GetAtt:
|
|
153
|
+
- BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
|
|
154
|
+
- Arn
|
|
155
|
+
Sid: BucketDeny
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## RestrictBucketToRoles example
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import {MdaaRoleResolver} from '@aws-mdaa/am-role-helper'
|
|
162
|
+
import {RestrictBucketToRoles} from '@aws-mdaa/3-bucketpolicy-helper'
|
|
163
|
+
|
|
164
|
+
const roleResolver = new MdaaRoleResolver({
|
|
165
|
+
roleArns: [
|
|
166
|
+
'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
|
|
167
|
+
'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
|
|
168
|
+
]
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
roleResolver.init().then(() => {
|
|
172
|
+
const RestrictBucket = new RestrictBucketToRoles({
|
|
173
|
+
// bucket in this context is a constructed s3.Bucket class
|
|
174
|
+
s3Bucket: bucket,
|
|
175
|
+
roles: [
|
|
176
|
+
'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
|
|
177
|
+
'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
|
|
178
|
+
],
|
|
179
|
+
roleAroaResolver: roleResolver
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
bucket.addToResourcePolicy(RestrictBucket.allowStatement())
|
|
183
|
+
bucket.addToResourcePolicy(RestrictBucket.denyStatement())
|
|
184
|
+
})
|
|
185
|
+
```
|