UNPKG

@aws-cdk/aws-ec2

Version:

The CDK Construct Library for AWS::EC2

343 lines 27.7 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Port = exports.Protocol = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const core_1 = require("@aws-cdk/core"); /** * Protocol for use in Connection Rules * * https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml */ var Protocol; (function (Protocol) { Protocol["ALL"] = "-1"; Protocol["HOPOPT"] = "0"; Protocol["ICMP"] = "icmp"; Protocol["IGMP"] = "2"; Protocol["GGP"] = "3"; Protocol["IPV4"] = "4"; Protocol["ST"] = "5"; Protocol["TCP"] = "tcp"; Protocol["CBT"] = "7"; Protocol["EGP"] = "8"; Protocol["IGP"] = "9"; Protocol["BBN_RCC_MON"] = "10"; Protocol["NVP_II"] = "11"; Protocol["PUP"] = "12"; Protocol["EMCON"] = "14"; Protocol["XNET"] = "15"; Protocol["CHAOS"] = "16"; Protocol["UDP"] = "udp"; Protocol["MUX"] = "18"; Protocol["DCN_MEAS"] = "19"; Protocol["HMP"] = "20"; Protocol["PRM"] = "21"; Protocol["XNS_IDP"] = "22"; Protocol["TRUNK_1"] = "23"; Protocol["TRUNK_2"] = "24"; Protocol["LEAF_1"] = "25"; Protocol["LEAF_2"] = "26"; Protocol["RDP"] = "27"; Protocol["IRTP"] = "28"; Protocol["ISO_TP4"] = "29"; Protocol["NETBLT"] = "30"; Protocol["MFE_NSP"] = "31"; Protocol["MERIT_INP"] = "32"; Protocol["DCCP"] = "33"; Protocol["THREEPC"] = "34"; Protocol["IDPR"] = "35"; Protocol["XTP"] = "36"; Protocol["DDP"] = "37"; Protocol["IDPR_CMTP"] = "38"; Protocol["TPPLUSPLUS"] = "39"; Protocol["IL"] = "40"; Protocol["IPV6"] = "41"; Protocol["SDRP"] = "42"; Protocol["IPV6_ROUTE"] = "43"; Protocol["IPV6_FRAG"] = "44"; Protocol["IDRP"] = "45"; Protocol["RSVP"] = "46"; Protocol["GRE"] = "47"; Protocol["DSR"] = "48"; Protocol["BNA"] = "49"; Protocol["ESP"] = "50"; Protocol["AH"] = "51"; Protocol["I_NLSP"] = "52"; Protocol["SWIPE"] = "53"; Protocol["NARP"] = "54"; Protocol["MOBILE"] = "55"; Protocol["TLSP"] = "56"; Protocol["SKIP"] = "57"; Protocol["ICMPV6"] = "icmpv6"; Protocol["IPV6_NONXT"] = "59"; Protocol["IPV6_OPTS"] = "60"; Protocol["CFTP"] = "62"; Protocol["ANY_LOCAL"] = "63"; Protocol["SAT_EXPAK"] = "64"; Protocol["KRYPTOLAN"] = "65"; Protocol["RVD"] = "66"; Protocol["IPPC"] = "67"; Protocol["ANY_DFS"] = "68"; Protocol["SAT_MON"] = "69"; Protocol["VISA"] = "70"; Protocol["IPCV"] = "71"; Protocol["CPNX"] = "72"; Protocol["CPHB"] = "73"; Protocol["WSN"] = "74"; Protocol["PVP"] = "75"; Protocol["BR_SAT_MON"] = "76"; Protocol["SUN_ND"] = "77"; Protocol["WB_MON"] = "78"; Protocol["WB_EXPAK"] = "79"; Protocol["ISO_IP"] = "80"; Protocol["VMTP"] = "81"; Protocol["SECURE_VMTP"] = "82"; Protocol["VINES"] = "83"; Protocol["TTP"] = "84"; Protocol["IPTM"] = "84_"; Protocol["NSFNET_IGP"] = "85"; Protocol["DGP"] = "86"; Protocol["TCF"] = "87"; Protocol["EIGRP"] = "88"; Protocol["OSPFIGP"] = "89"; Protocol["SPRITE_RPC"] = "90"; Protocol["LARP"] = "91"; Protocol["MTP"] = "92"; Protocol["AX_25"] = "93"; Protocol["IPIP"] = "94"; Protocol["MICP"] = "95"; Protocol["SCC_SP"] = "96"; Protocol["ETHERIP"] = "97"; Protocol["ENCAP"] = "98"; Protocol["ANY_ENC"] = "99"; Protocol["GMTP"] = "100"; Protocol["IFMP"] = "101"; Protocol["PNNI"] = "102"; Protocol["PIM"] = "103"; Protocol["ARIS"] = "104"; Protocol["SCPS"] = "105"; Protocol["QNX"] = "106"; Protocol["A_N"] = "107"; Protocol["IPCOMP"] = "108"; Protocol["SNP"] = "109"; Protocol["COMPAQ_PEER"] = "110"; Protocol["IPX_IN_IP"] = "111"; Protocol["VRRP"] = "112"; Protocol["PGM"] = "113"; Protocol["ANY_0_HOP"] = "114"; Protocol["L2_T_P"] = "115"; Protocol["DDX"] = "116"; Protocol["IATP"] = "117"; Protocol["STP"] = "118"; Protocol["SRP"] = "119"; Protocol["UTI"] = "120"; Protocol["SMP"] = "121"; Protocol["SM"] = "122"; Protocol["PTP"] = "123"; Protocol["ISIS_IPV4"] = "124"; Protocol["FIRE"] = "125"; Protocol["CRTP"] = "126"; Protocol["CRUDP"] = "127"; Protocol["SSCOPMCE"] = "128"; Protocol["IPLT"] = "129"; Protocol["SPS"] = "130"; Protocol["PIPE"] = "131"; Protocol["SCTP"] = "132"; Protocol["FC"] = "133"; Protocol["RSVP_E2E_IGNORE"] = "134"; Protocol["MOBILITY_HEADER"] = "135"; Protocol["UDPLITE"] = "136"; Protocol["MPLS_IN_IP"] = "137"; Protocol["MANET"] = "138"; Protocol["HIP"] = "139"; Protocol["SHIM6"] = "140"; Protocol["WESP"] = "141"; Protocol["ROHC"] = "142"; Protocol["ETHERNET"] = "143"; Protocol["EXPERIMENT_1"] = "253"; Protocol["EXPERIMENT_2"] = "254"; Protocol["RESERVED"] = "255"; })(Protocol = exports.Protocol || (exports.Protocol = {})); /** * Interface for classes that provide the connection-specification parts of a security group rule */ class Port { constructor(props) { this.props = props; try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_PortProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Port); } throw error; } this.canInlineRule = !core_1.Token.isUnresolved(props.fromPort) && !core_1.Token.isUnresolved(props.toPort); } /** * A single TCP port */ static tcp(port) { return new Port({ protocol: Protocol.TCP, fromPort: port, toPort: port, stringRepresentation: renderPort(port), }); } /** * A TCP port range */ static tcpRange(startPort, endPort) { return new Port({ protocol: Protocol.TCP, fromPort: startPort, toPort: endPort, stringRepresentation: `${renderPort(startPort)}-${renderPort(endPort)}`, }); } /** * Any TCP traffic */ static allTcp() { return new Port({ protocol: Protocol.TCP, fromPort: 0, toPort: 65535, stringRepresentation: 'ALL PORTS', }); } /** * A single UDP port */ static udp(port) { return new Port({ protocol: Protocol.UDP, fromPort: port, toPort: port, stringRepresentation: `UDP ${renderPort(port)}`, }); } /** * A UDP port range */ static udpRange(startPort, endPort) { return new Port({ protocol: Protocol.UDP, fromPort: startPort, toPort: endPort, stringRepresentation: `UDP ${renderPort(startPort)}-${renderPort(endPort)}`, }); } /** * Any UDP traffic */ static allUdp() { return new Port({ protocol: Protocol.UDP, fromPort: 0, toPort: 65535, stringRepresentation: 'UDP ALL PORTS', }); } /** * A specific combination of ICMP type and code * * @see https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml */ static icmpTypeAndCode(type, code) { return new Port({ protocol: Protocol.ICMP, fromPort: type, toPort: code, stringRepresentation: `ICMP Type ${type} Code ${code}`, }); } /** * All codes for a single ICMP type */ static icmpType(type) { return new Port({ protocol: Protocol.ICMP, fromPort: type, toPort: -1, stringRepresentation: `ICMP Type ${type}`, }); } /** * ICMP ping (echo) traffic */ static icmpPing() { return Port.icmpType(8); } /** * All ICMP traffic */ static allIcmp() { return new Port({ protocol: Protocol.ICMP, fromPort: -1, toPort: -1, stringRepresentation: 'ALL ICMP', }); } /** * All traffic */ static allTraffic() { return new Port({ protocol: Protocol.ALL, stringRepresentation: 'ALL TRAFFIC', }); } /** * A single ESP port */ static esp() { return new Port({ protocol: Protocol.ESP, fromPort: 50, toPort: 50, stringRepresentation: 'ESP 50', }); } /** * A single AH port */ static ah() { return new Port({ protocol: Protocol.AH, fromPort: 51, toPort: 51, stringRepresentation: 'AH 51', }); } /** * Produce the ingress/egress rule JSON for the given connection */ toRuleJson() { // JSII does not allow enum types to have same value. So to support the enum, the enum with same value has to be mapped later. const PROTOCOL_MAP = { [Protocol.IPTM]: '84', }; return { ipProtocol: PROTOCOL_MAP[this.props.protocol] ?? this.props.protocol, fromPort: this.props.fromPort, toPort: this.props.toPort, }; } toString() { return this.props.stringRepresentation; } } exports.Port = Port; _a = JSII_RTTI_SYMBOL_1; Port[_a] = { fqn: "@aws-cdk/aws-ec2.Port", version: "1.204.0" }; function renderPort(port) { return core_1.Token.isUnresolved(port) ? '{IndirectPort}' : port.toString(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0NBQXNDO0FBRXRDOzs7O0dBSUc7QUFDSCxJQUFZLFFBb0pYO0FBcEpELFdBQVksUUFBUTtJQUNsQixzQkFBVSxDQUFBO0lBQ1Ysd0JBQVksQ0FBQTtJQUNaLHlCQUFhLENBQUE7SUFDYixzQkFBVSxDQUFBO0lBQ1YscUJBQVMsQ0FBQTtJQUNULHNCQUFVLENBQUE7SUFDVixvQkFBUSxDQUFBO0lBQ1IsdUJBQVcsQ0FBQTtJQUNYLHFCQUFTLENBQUE7SUFDVCxxQkFBUyxDQUFBO0lBQ1QscUJBQVMsQ0FBQTtJQUNULDhCQUFrQixDQUFBO0lBQ2xCLHlCQUFhLENBQUE7SUFDYixzQkFBVSxDQUFBO0lBQ1Ysd0JBQVksQ0FBQTtJQUNaLHVCQUFXLENBQUE7SUFDWCx3QkFBWSxDQUFBO0lBQ1osdUJBQVcsQ0FBQTtJQUNYLHNCQUFVLENBQUE7SUFDViwyQkFBZSxDQUFBO0lBQ2Ysc0JBQVUsQ0FBQTtJQUNWLHNCQUFVLENBQUE7SUFDViwwQkFBYyxDQUFBO0lBQ2QsMEJBQWMsQ0FBQTtJQUNkLDBCQUFjLENBQUE7SUFDZCx5QkFBYSxDQUFBO0lBQ2IseUJBQWEsQ0FBQTtJQUNiLHNCQUFVLENBQUE7SUFDVix1QkFBVyxDQUFBO0lBQ1gsMEJBQWMsQ0FBQTtJQUNkLHlCQUFhLENBQUE7SUFDYiwwQkFBYyxDQUFBO0lBQ2QsNEJBQWdCLENBQUE7SUFDaEIsdUJBQVcsQ0FBQTtJQUNYLDBCQUFjLENBQUE7SUFDZCx1QkFBVyxDQUFBO0lBQ1gsc0JBQVUsQ0FBQTtJQUNWLHNCQUFVLENBQUE7SUFDViw0QkFBZ0IsQ0FBQTtJQUNoQiw2QkFBaUIsQ0FBQTtJQUNqQixxQkFBUyxDQUFBO0lBQ1QsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCw2QkFBaUIsQ0FBQTtJQUNqQiw0QkFBZ0IsQ0FBQTtJQUNoQix1QkFBVyxD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LEtBQUssQ0FBQyxRQUFRO1lBQ3BFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtTQUMxQixDQUFDO0tBQ0g7SUFFTSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO0tBQ3hDOztBQXJMSCxvQkFzTEM7OztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVk7SUFDOUIsT0FBTyxZQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbiB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuXG4vKipcbiAqIFByb3RvY29sIGZvciB1c2UgaW4gQ29ubmVjdGlvbiBSdWxlc1xuICpcbiAqIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3Byb3RvY29sLW51bWJlcnMvcHJvdG9jb2wtbnVtYmVycy54aHRtbFxuICovXG5leHBvcnQgZW51bSBQcm90b2NvbCB7XG4gIEFMTCA9ICctMScsXG4gIEhPUE9QVCA9ICcwJyxcbiAgSUNNUCA9ICdpY21wJyxcbiAgSUdNUCA9ICcyJyxcbiAgR0dQID0gJzMnLFxuICBJUFY0ID0gJzQnLFxuICBTVCA9ICc1JyxcbiAgVENQID0gJ3RjcCcsXG4gIENCVCA9ICc3JyxcbiAgRUdQID0gJzgnLFxuICBJR1AgPSAnOScsXG4gIEJCTl9SQ0NfTU9OID0gJzEwJyxcbiAgTlZQX0lJID0gJzExJyxcbiAgUFVQID0gJzEyJyxcbiAgRU1DT04gPSAnMTQnLFxuICBYTkVUID0gJzE1JyxcbiAgQ0hBT1MgPSAnMTYnLFxuICBVRFAgPSAndWRwJyxcbiAgTVVYID0gJzE4JyxcbiAgRENOX01FQVMgPSAnMTknLFxuICBITVAgPSAnMjAnLFxuICBQUk0gPSAnMjEnLFxuICBYTlNfSURQID0gJzIyJyxcbiAgVFJVTktfMSA9ICcyMycsXG4gIFRSVU5LXzIgPSAnMjQnLFxuICBMRUFGXzEgPSAnMjUnLFxuICBMRUFGXzIgPSAnMjYnLFxuICBSRFAgPSAnMjcnLFxuICBJUlRQID0gJzI4JyxcbiAgSVNPX1RQNCA9ICcyOScsXG4gIE5FVEJMVCA9ICczMCcsXG4gIE1GRV9OU1AgPSAnMzEnLFxuICBNRVJJVF9JTlAgPSAnMzInLFxuICBEQ0NQID0gJzMzJyxcbiAgVEhSRUVQQyA9ICczNCcsXG4gIElEUFIgPSAnMzUnLFxuICBYVFAgPSAnMzYnLFxuICBERFAgPSAnMzcnLFxuICBJRFBSX0NNVFAgPSAnMzgnLFxuICBUUFBMVVNQTFVTID0gJzM5JyxcbiAgSUwgPSAnNDAnLFxuICBJUFY2ID0gJzQxJyxcbiAgU0RSUCA9ICc0MicsXG4gIElQVjZfUk9VVEUgPSAnNDMnLFxuICBJUFY2X0ZSQUcgPSAnNDQnLFxuICBJRFJQID0gJzQ1JyxcbiAgUlNWUCA9ICc0NicsXG4gIEdSRSA9ICc0NycsXG4gIERTUiA9ICc0OCcsXG4gIEJOQSA9ICc0OScsXG4gIEVTUCA9ICc1MCcsXG4gIEFIID0gJzUxJyxcbiAgSV9OTFNQID0gJzUyJyxcbiAgU1dJUEUgPSAnNTMnLFxuICBOQVJQID0gJzU0JyxcbiAgTU9CSUxFID0gJzU1JyxcbiAgVExTUCA9ICc1NicsXG4gIFNLSVAgPSAnNTcnLFxuICBJQ01QVjYgPSAnaWNtcHY2JyxcbiAgSVBWNl9OT05YVCA9ICc1OScsXG4gIElQVjZfT1BUUyA9ICc2MCcsXG4gIENGVFAgPSAnNjInLFxuICBBTllfTE9DQUwgPSAnNjMnLFxuICBTQVRfRVhQQUsgPSAnNjQnLFxuICBLUllQVE9MQU4gPSAnNjUnLFxuICBSVkQgPSAnNjYnLFxuICBJUFBDID0gJzY3JyxcbiAgQU5ZX0RGUyA9ICc2OCcsXG4gIFNBVF9NT04gPSAnNjknLFxuICBWSVNBID0gJzcwJyxcbiAgSVBDViA9ICc3MScsXG4gIENQTlggPSAnNzInLFxuICBDUEhCID0gJzczJyxcbiAgV1NOID0gJzc0JyxcbiAgUFZQID0gJzc1JyxcbiAgQlJfU0FUX01PTiA9ICc3NicsXG4gIFNVTl9ORCA9ICc3NycsXG4gIFdCX01PTiA9ICc3OCcsXG4gIFdCX0VYUEFLID0gJzc5JyxcbiAgSVNPX0lQID0gJzgwJyxcbiAgVk1UUCA9ICc4MScsXG4gIFNFQ1VSRV9WTVRQID0gJzgyJyxcbiAgVklORVMgPSAnODMnLFxuICBUVFAgPSAnODQnLFxuICBJUFRNID0gJzg0XycsXG4gIE5TRk5FVF9JR1AgPSAnODUnLFxuICBER1AgPSAnODYnLFxuICBUQ0YgPSAnODcnLFxuICBFSUdSUCA9ICc4OCcsXG4gIE9TUEZJR1AgPSAnODknLFxuICBTUFJJVEVfUlBDID0gJzkwJyxcbiAgTEFSUCA9ICc5MScsXG4gIE1UUCA9ICc5MicsXG4gIEFYXzI1ID0gJzkzJyxcbiAgSVBJUCA9ICc5NCcsXG4gIE1JQ1AgPSAnOTUnLFxuICBTQ0NfU1AgPSAnOTYnLFxuICBFVEhFUklQID0gJzk3JyxcbiAgRU5DQVAgPSAnOTgnLFxuICBBTllfRU5DID0gJzk5JyxcbiAgR01UUCA9ICcxMDAnLFxuICBJRk1QID0gJzEwMScsXG4gIFBOTkkgPSAnMTAyJyxcbiAgUElNID0gJzEwMycsXG4gIEFSSVMgPSAnMTA0JyxcbiAgU0NQUyA9ICcxMDUnLFxuICBRTlggPSAnMTA2JyxcbiAgQV9OID0gJzEwNycsXG4gIElQQ09NUCA9ICcxMDgnLFxuICBTTlAgPSAnMTA5JyxcbiAgQ09NUEFRX1BFRVIgPSAnMTEwJyxcbiAgSVBYX0lOX0lQID0gJzExMScsXG4gIFZSUlAgPSAnMTEyJyxcbiAgUEdNID0gJzExMycsXG4gIEFOWV8wX0hPUCA9ICcxMTQnLFxuICBMMl9UX1AgPSAnMTE1JyxcbiAgRERYID0gJzExNicsXG4gIElBVFAgPSAnMTE3JyxcbiAgU1RQID0gJzExOCcsXG4gIFNSUCA9ICcxMTknLFxuICBVVEkgPSAnMTIwJyxcbiAgU01QID0gJzEyMScsXG4gIFNNID0gJzEyMicsXG4gIFBUUCA9ICcxMjMnLFxuICBJU0lTX0lQVjQgPSAnMTI0JyxcbiAgRklSRSA9ICcxMjUnLFxuICBDUlRQID0gJzEyNicsXG4gIENSVURQID0gJzEyNycsXG4gIFNTQ09QTUNFID0gJzEyOCcsXG4gIElQTFQgPSAnMTI5JyxcbiAgU1BTID0gJzEzMCcsXG4gIFBJUEUgPSAnMTMxJyxcbiAgU0NUUCA9ICcxMzInLFxuICBGQyA9ICcxMzMnLFxuICBSU1ZQX0UyRV9JR05PUkUgPSAnMTM0JyxcbiAgTU9CSUxJVFlfSEVBREVSID0gJzEzNScsXG4gIFVEUExJVEUgPSAnMTM2JyxcbiAgTVBMU19JTl9JUCA9ICcxMzcnLFxuICBNQU5FVCA9ICcxMzgnLFxuICBISVAgPSAnMTM5JyxcbiAgU0hJTTYgPSAnMTQwJyxcbiAgV0VTUCA9ICcxNDEnLFxuICBST0hDID0gJzE0MicsXG4gIEVUSEVSTkVUID0gJzE0MycsXG4gIEVYUEVSSU1FTlRfMSA9ICcyNTMnLFxuICBFWFBFUklNRU5UXzIgPSAnMjU0JyxcbiAgUkVTRVJWRUQgPSAnMjU1Jyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIHBvcnQgcmFuZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3J0UHJvcHMge1xuICAvKipcbiAgICogVGhlIHByb3RvY29sIGZvciB0aGUgcmFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbDtcblxuICAvKipcbiAgICogVGhlIHN0YXJ0aW5nIHBvcnQgZm9yIHRoZSByYW5nZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdCBpbmNsdWRlZCBpbiB0aGUgcnVsZVxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbVBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRpbmcgcG9ydCBmb3IgdGhlIHJhbmdlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IGluY2x1ZGVkIGluIHRoZSBydWxlXG4gICAqL1xuICByZWFkb25seSB0b1BvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBvYmplY3RcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ1JlcHJlc2VudGF0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgY29ubmVjdGlvbi1zcGVjaWZpY2F0aW9uIHBhcnRzIG9mIGEgc2VjdXJpdHkgZ3JvdXAgcnVsZVxuICovXG5leHBvcnQgY2xhc3MgUG9ydCB7XG4gIC8qKlxuICAgKiBBIHNpbmdsZSBUQ1AgcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0Y3AocG9ydDogbnVtYmVyKTogUG9ydCB7XG4gICAgcmV0dXJuIG5ldyBQb3J0KHtcbiAgICAgIHByb3RvY29sOiBQcm90b2NvbC5UQ1AsXG4gICAgICBmcm9tUG9ydDogcG9ydCxcbiAgICAgIHRvUG9ydDogcG9ydCxcbiAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uOiByZW5kZXJQb3J0KHBvcnQpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgVENQIHBvcnQgcmFuZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGNwUmFuZ2Uoc3RhcnRQb3J0OiBudW1iZXIsIGVuZFBvcnQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuVENQLFxuICAgICAgZnJvbVBvcnQ6IHN0YXJ0UG9ydCxcbiAgICAgIHRvUG9ydDogZW5kUG9ydCxcbiAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uOiBgJHtyZW5kZXJQb3J0KHN0YXJ0UG9ydCl9LSR7cmVuZGVyUG9ydChlbmRQb3J0KX1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBUQ1AgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxUY3AoKSB7XG4gICAgcmV0dXJuIG5ldyBQb3J0KHtcbiAgICAgIHByb3RvY29sOiBQcm90b2NvbC5UQ1AsXG4gICAgICBmcm9tUG9ydDogMCxcbiAgICAgIHRvUG9ydDogNjU1MzUsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogJ0FMTCBQT1JUUycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBzaW5nbGUgVURQIHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdWRwKHBvcnQ6IG51bWJlcik6IFBvcnQge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuVURQLFxuICAgICAgZnJvbVBvcnQ6IHBvcnQsXG4gICAgICB0b1BvcnQ6IHBvcnQsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogYFVEUCAke3JlbmRlclBvcnQocG9ydCl9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIFVEUCBwb3J0IHJhbmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVkcFJhbmdlKHN0YXJ0UG9ydDogbnVtYmVyLCBlbmRQb3J0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFBvcnQoe1xuICAgICAgcHJvdG9jb2w6IFByb3RvY29sLlVEUCxcbiAgICAgIGZyb21Qb3J0OiBzdGFydFBvcnQsXG4gICAgICB0b1BvcnQ6IGVuZFBvcnQsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogYFVEUCAke3JlbmRlclBvcnQoc3RhcnRQb3J0KX0tJHtyZW5kZXJQb3J0KFxuICAgICAgICBlbmRQb3J0LFxuICAgICAgKX1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBVRFAgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxVZHAoKSB7XG4gICAgcmV0dXJuIG5ldyBQb3J0KHtcbiAgICAgIHByb3RvY29sOiBQcm90b2NvbC5VRFAsXG4gICAgICBmcm9tUG9ydDogMCxcbiAgICAgIHRvUG9ydDogNjU1MzUsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogJ1VEUCBBTEwgUE9SVFMnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lmaWMgY29tYmluYXRpb24gb2YgSUNNUCB0eXBlIGFuZCBjb2RlXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvaWNtcC1wYXJhbWV0ZXJzL2ljbXAtcGFyYW1ldGVycy54aHRtbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpY21wVHlwZUFuZENvZGUodHlwZTogbnVtYmVyLCBjb2RlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFBvcnQoe1xuICAgICAgcHJvdG9jb2w6IFByb3RvY29sLklDTVAsXG4gICAgICBmcm9tUG9ydDogdHlwZSxcbiAgICAgIHRvUG9ydDogY29kZSxcbiAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uOiBgSUNNUCBUeXBlICR7dHlwZX0gQ29kZSAke2NvZGV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgY29kZXMgZm9yIGEgc2luZ2xlIElDTVAgdHlwZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpY21wVHlwZSh0eXBlOiBudW1iZXIpOiBQb3J0IHtcbiAgICByZXR1cm4gbmV3IFBvcnQoe1xuICAgICAgcHJvdG9jb2w6IFByb3RvY29sLklDTVAsXG4gICAgICBmcm9tUG9ydDogdHlwZSxcbiAgICAgIHRvUG9ydDogLTEsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogYElDTVAgVHlwZSAke3R5cGV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJQ01QIHBpbmcgKGVjaG8pIHRyYWZmaWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWNtcFBpbmcoKSB7XG4gICAgcmV0dXJuIFBvcnQuaWNtcFR5cGUoOCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIElDTVAgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxJY21wKCkge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuSUNNUCxcbiAgICAgIGZyb21Qb3J0OiAtMSxcbiAgICAgIHRvUG9ydDogLTEsXG4gICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbjogJ0FMTCBJQ01QJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxUcmFmZmljKCkge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuQUxMLFxuICAgICAgc3RyaW5nUmVwcmVzZW50YXRpb246ICdBTEwgVFJBRkZJQycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBzaW5nbGUgRVNQIHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXNwKCk6IFBvcnQge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuRVNQLFxuICAgICAgZnJvbVBvcnQ6IDUwLFxuICAgICAgdG9Qb3J0OiA1MCxcbiAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uOiAnRVNQIDUwJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNpbmdsZSBBSCBwb3J0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFoKCk6IFBvcnQge1xuICAgIHJldHVybiBuZXcgUG9ydCh7XG4gICAgICBwcm90b2NvbDogUHJvdG9jb2wuQUgsXG4gICAgICBmcm9tUG9ydDogNTEsXG4gICAgICB0b1BvcnQ6IDUxLFxuICAgICAgc3RyaW5nUmVwcmVzZW50YXRpb246ICdBSCA1MScsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcnVsZSBjb250YWluaW5nIHRoaXMgcG9ydCByYW5nZSBjYW4gYmUgaW5saW5lZCBpbnRvIGEgc2VjdXJpdHlncm91cCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuSW5saW5lUnVsZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBQb3J0UHJvcHMpIHtcbiAgICB0aGlzLmNhbklubGluZVJ1bGUgPVxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5mcm9tUG9ydCkgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy50b1BvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIGluZ3Jlc3MvZWdyZXNzIHJ1bGUgSlNPTiBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyB0b1J1bGVKc29uKCk6IGFueSB7XG4gICAgLy8gSlNJSSBkb2VzIG5vdCBhbGxvdyBlbnVtIHR5cGVzIHRvIGhhdmUgc2FtZSB2YWx1ZS4gU28gdG8gc3VwcG9ydCB0aGUgZW51bSwgdGhlIGVudW0gd2l0aCBzYW1lIHZhbHVlIGhhcyB0byBiZSBtYXBwZWQgbGF0ZXIuXG4gICAgY29uc3QgUFJPVE9DT0xfTUFQOiBQYXJ0aWFsPFJlY29yZDxQcm90b2NvbCwgc3RyaW5nPj4gPSB7XG4gICAgICBbUHJvdG9jb2wuSVBUTV06ICc4NCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgaXBQcm90b2NvbDogUFJPVE9DT0xfTUFQW3RoaXMucHJvcHMucHJvdG9jb2xdID8/IHRoaXMucHJvcHMucHJvdG9jb2wsXG4gICAgICBmcm9tUG9ydDogdGhpcy5wcm9wcy5mcm9tUG9ydCxcbiAgICAgIHRvUG9ydDogdGhpcy5wcm9wcy50b1BvcnQsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnN0cmluZ1JlcHJlc2VudGF0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclBvcnQocG9ydDogbnVtYmVyKSB7XG4gIHJldHVybiBUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgPyAne0luZGlyZWN0UG9ydH0nIDogcG9ydC50b1N0cmluZygpO1xufVxuIl19