{"format":1,"manifest":{"name":"kubectl-tools","publisher":"vyloxi","version":"1.0.0","displayName":"Kubernetes Tools","description":"The everyday kubectl commands from the command palette, with a default namespace and context. Deleting and applying ask first.","engines":{"ferrum":"^0.1.0"},"categories":["Tools"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onCommand:kubectlTools.menu","onCommand:kubectlTools.applyFile","onCommand:kubectlTools.deleteFile","onCommand:kubectlTools.pods","onCommand:kubectlTools.services","onCommand:kubectlTools.deployments","onCommand:kubectlTools.ingress","onCommand:kubectlTools.all","onCommand:kubectlTools.nodes","onCommand:kubectlTools.events","onCommand:kubectlTools.top","onCommand:kubectlTools.describe","onCommand:kubectlTools.logs","onCommand:kubectlTools.logsPrev","onCommand:kubectlTools.exec","onCommand:kubectlTools.restart","onCommand:kubectlTools.rolloutStatus","onCommand:kubectlTools.rollback","onCommand:kubectlTools.scale","onCommand:kubectlTools.portForward","onCommand:kubectlTools.deletePod","onCommand:kubectlTools.contexts","onCommand:kubectlTools.useContext","onCommand:kubectlTools.namespaces","onCommand:kubectlTools.setNamespace"],"permissions":["terminal"],"contributes":{"commands":[{"command":"kubectlTools.menu","title":"Kubernetes Menu...","category":"Kubernetes Tools"},{"command":"kubectlTools.applyFile","title":"Apply the Open YAML File...","category":"Kubernetes Tools"},{"command":"kubectlTools.deleteFile","title":"Delete What the Open YAML File Defines...","category":"Kubernetes Tools"},{"command":"kubectlTools.pods","title":"Get Pods","category":"Kubernetes Tools"},{"command":"kubectlTools.services","title":"Get Services","category":"Kubernetes Tools"},{"command":"kubectlTools.deployments","title":"Get Deployments","category":"Kubernetes Tools"},{"command":"kubectlTools.ingress","title":"Get Ingresses","category":"Kubernetes Tools"},{"command":"kubectlTools.all","title":"Get Everything in the Namespace","category":"Kubernetes Tools"},{"command":"kubectlTools.nodes","title":"Get Nodes","category":"Kubernetes Tools"},{"command":"kubectlTools.events","title":"Show Recent Events","category":"Kubernetes Tools"},{"command":"kubectlTools.top","title":"Show Pod CPU and Memory","category":"Kubernetes Tools"},{"command":"kubectlTools.describe","title":"Describe a Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.logs","title":"Follow Logs of a Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.logsPrev","title":"Show Logs of a Crashed Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.exec","title":"Open a Shell in a Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.restart","title":"Restart a Deployment...","category":"Kubernetes Tools"},{"command":"kubectlTools.rolloutStatus","title":"Watch a Rollout...","category":"Kubernetes Tools"},{"command":"kubectlTools.rollback","title":"Undo the Last Rollout...","category":"Kubernetes Tools"},{"command":"kubectlTools.scale","title":"Scale a Deployment...","category":"Kubernetes Tools"},{"command":"kubectlTools.portForward","title":"Forward a Port from a Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.deletePod","title":"Delete a Pod...","category":"Kubernetes Tools"},{"command":"kubectlTools.contexts","title":"List Contexts","category":"Kubernetes Tools"},{"command":"kubectlTools.useContext","title":"Switch Context...","category":"Kubernetes Tools"},{"command":"kubectlTools.namespaces","title":"List Namespaces","category":"Kubernetes Tools"},{"command":"kubectlTools.setNamespace","title":"Set the Default Namespace...","category":"Kubernetes Tools"}],"keybindings":[{"command":"kubectlTools.menu","key":"Ctrl+Alt+Shift+K"}],"configuration":{"title":"Kubernetes Tools","properties":{"kubectlTools.namespace":{"type":"string","default":"","description":"The namespace added to commands (-n). Empty uses your current one."},"kubectlTools.context":{"type":"string","default":"","description":"The context added to commands (--context). Empty uses your current one."}}}}},"files":{"icon.png":{"encoding":"base64","content":"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAurElEQVR42u19eZwdVZ3v95xTVXe/3Z1OZ+vOvpEQdpAdhBEZ4iDjOI3DKKg440PHp77h4ciMQ5JRBh/oPJcRRwdFZURNxAEXIIBEtgDZgAQChDWQtffl7lXn/N4fp+rue99ugo/7+bTB7qq6VfX9nd/v+1sPQ5Of3t71YsP6XgXGCADOXUMGHXxghZTpM4icE+E4J5BSc8B5NylJjDGmzySQ/qfKh8r8neq8M6r6Oyr8n/LHUY0rV7u3CgdRvc9A7pFExLhgRGo/Y/wAF+ZTjPEdMH2bffPbn39o3XmOewLr7d3AN2y4VDaDI2v4jDVrONauJQ/4cz55/zHSSX6EpH0RgZYZZtDHDT8YE2CMgQur4DVQTTwrg08TAD6HO9UBXvnrE9X43ooPV6fQlzlGyYw+X0koJw3HTqQB7OHcuIf5gv/1xI8+sMuVGIa1axnWrVOTJgC9veuFJ2lnX3n3e6VKXwNS55uBdi4MPwwrBGEGFTf8xLlgABhjnFE+gFRb+nM3lxMYqgdoanTV1wc+1aORKjxc6blU87kLL6mIACKSpOwUk3aCy0wcSqaRSY4qxtiDEOZNW3562X3FGLVOAPJW/elX/mYVg7yRg19k+KIwfGFYgU5HGD4OBgYiRqRyq5aKwGEo/+JK/k5llSgo7xgqApAVaQsqOo5V0DRF303FwFDhfZXgSFRwbSp7b1TXc1dbH4xxgDECESknpTKJYcPJxOCkYyBS9yhFX9i2/opnAWLAWgbU1gaskVV/+sfvWsugrjV8EcsX6FRWqIs4F5xIMpCqZ0HUbecnvOIrriya/BVfnTBUePbyVys9zxNmDsY4KeUoOz7IMslh7qTHMwR+w9ZfXL62Xm3A6gH/7A/fMVta4lbD9F9oWBH423qkEJYg5bjSz0ptdQOqvrydnyTgq5K8VgJfv7qv5zcoa0q0amLcgHTSMj12QDjpOKST2igN9vHtP738YC0hqCgA567ZZDy07jzn9I/dcQpjxl2GFZjtD81yfOEuQSQZlGoc+LoJHjUEfGWC98cIfLl704uQMU6Z+JBMxw4b0k4clCQv2bb+yq3nnrvJeOghz2uoQwA8qdHgi42mL9oRap/vCCtokLLzjfDUqPvJBL4WeG8l8A3fG2ltkEk6ydE3DTs1NqygLty2/sqtlTQBK+V7xNetY+q0K371Ls7ZvaYv2hHuXCK5YWqVnwf+1AJfjtm3EvgKK6uFwNfWdM0CX8gRGDegpC0TQ68KOz0+LMn50+0b/naLh20VAVjDgbV06id+PUNItdP0t80Idy6WnBuCSLqHU7XnmxqC1zTw9arUen35KQa+bmJLYIxDKkcmhl8Xdmq0j3P/sU/+/K/7gDUF3gEvVP1HMwDgtrzNsMIzQu3zHS5MQeQUBEOoahCnElkp/18lx1Exg847g+p4ARXYNdW4t6IvKQK+GHwqry0qqHtClfPyhbLh61d6Z4AiCc5NEYj2OIYZmqFk8jaAABdj7yOK7f4ZVxyzxvSFP+GPzHLMQLtB0gYYe2tX/B+lS1eb3zTm0RS/MwaQBDd8nIE5StpL5yx/kvb/8vJNvb3rxe7dGyhrAjzbcMaVdy6HpF3+yEwRmraAKWmzmqGCd1y6yWP2TQFffH0C4wYlht+kdLxfmjCO2bzh8hc9zAtMANnOt0x/2PRHZ5FSsgb4lVUSVQWfaqo8qqXyqqp70tHHhlV9nrJvQh1TWTtPDZnIwnur9dwVTGvJ9RlIKeaLzCTDCpsZmfoWAKzDWv3XrOq/8s7zGPiDgWiP9EdmiUJ37x2XbupdusoEr/qKL6+lGTeQjvXJ5PgBAaLzt6z/2Kbe3vUiqwFUJn2dYUVghaaj0N1rEcEjqqruaSIrvmTVVlKprVvxqHfF17p+BW1Uem69K76C/CgHZnAaDCsMx0lfV+AGnvXxu1c6MrUz1N7DA209rCTY845L9xa6dBWipUR1lEVQwRMzbiA1doCSowcU575jt2y4fDcHAOkkP2r524QV7JQF/v47Lt0R4NIVcarqfnjZ584mPZWE6e+Qpi8qlJP8KADwlb3PWkrZ7xOGD8LwcSg1ucCjXpVXidlPhOCVJ1HViW0lglcrBtIg8Kj8ziYCPBW8VwI3fJwbFhTJ963sXW8Zkejri1maLxG+kA4MFWT3/j9x6epS9UeCS1db1ZcgVvAnBcY4F1YQjPMlPp5cbDA7fY5hBX2GEVRExIsLH/5Ys3TcK8AgAuOAUpMBfL1VSJMNPOW5hARhBJRhBnyOTJ5jQDqncl8U3PBRrqijzlX/NnTpONcMJ57UiTHBGWyHEApwMMYgFR3ZLl2Z90qNRBahwA2LuLAAO36qoYiO5sIA45yBJAhsQpJ/pGbpOGcgIiSSEo4kLJsbwIcv6MK0qIHb7+/HlhdikAoI+jkMjiJBOFKAr+GBUR3aGgDjgkEYIElHGwzU7f2eivL8fwwuHecMIEIs4cAQDMcuCmH16R14z8ltMIR+3hOWhrDtxRjufGQI2/fEMBJzEAkKCO5qhGqVxG+JS9egu1nsDoIYQABHt8G56GbCAhhnoAoBoKYqbuuts58g8BVWlnBXfCzhgDPgtJVhfOj86ThpeTinDJVbSQPg5OVhnLw8jNcPpbBh0yAe2D6C0ZiNcEALgiLKFbi+RcDXZ+ermWXXI2CccWGBMd5tEDluzSv9UWTpBGdwFGEs7kDwUuDdGmtwzrR2yAqD/nfBLD+uuawbved1YsOmATywbQQjMRtBP4dlcC0Iqo4XTo2+s8kEvkx8hQhEkowin+9t69J56nok5qAtJPDu46P487OnFQHvkkBWmuPgHAUCogWhB73vno47HhrA5mfHcHAg4woCQ6FleCuZfZ3Al783ZpQGQdjbxqVjro2XijAacxAOcPz5WR3oPW86FszylQEeNT+MaQHJCsJsP67+qx5cOe7g148O4NePDuLgoCsIJoNSVFQRf6QDX3isUTmid+S6dIwBnDHYkjDuAn9JEfCeSq8X+GqCoIjQETHw0Ytm4f1nTXcFYQAHB9II+AQskwNEUERT7NI1vOJLTjdqqq4jyKXzgM/YCsmMxLSIwAUnFQNPuieRoyUfxgBRRhAuOWs67npkAHc/Poj9AykYgiHgEyAqV48weS5d2T6qasBToSIwSn/LjjiXLgu8o5BIScyeZuLyC6fjolM70NVuFgHPMBmfYkFojxj46OpZ6D2/Cw8/PYL1D/bhhb1xWIYrCCAomlyXriHgy1ybQJ4JKF6MR4ZLVwJ8p4mPXDAdl5w5De0RY0qAryUIQb/An57WifecMg33bx3ChgcP44W9iTxBcN3NSXHpmgE+LzGGPBNATQI/GS4dd+1vMq2QtnPAv//MaehwgZeKwKcQ+IqC4AJsCIaLTuvEBXmC8OLeBDgDQn4BuPmGia/4Buw8oWwcID/dY3hst5m++ckEPuNIHDUvgA+cPQ1nrIqUAC/eIuDLddZ49yKLBOHJ50Zx18P9eOK5USgFN9+QrxGmEvjyqWOjmZ75Vrt0OkGTB/zcAP7y3Z0F4dojDfhyn2JBOPPYdpx5bDu2vTCGn99/CE/uHoVShJBfuO6rmhRmXxF6D5O8VnWjXLfpVLl0nGtJjCcVFBGW97w9ga8kCB4/OfmoKE4+Koptz2tB2PL8KGxHIRQQMLx8w2QCXyX6WBgHUOULgSfLpUuk9Ao4/egw3n/mNLxrRbgAeMHfXsCXRheLBGFFFCeviOK5V2O4e3M/7tsyiNG4jUhQFM2TmGzgqSgOQMVTMCY3S8cYkHEIJywN4SMXFCZopgp4Ig0MuUBN5tcVC8LRi8I4elEYvX8yCz+//yDu3zIALlhhsmnCwFfpycj7E38rCi+JAIMD1364GyctD0Mq0sQoT31ONviMAUIwGEKDXys/0ypBYEy7j1IRFswO4ItXLELPTD/SGakjllVrFstBUMbOE1Wv3sq7Pm8d8PUVXjJGSGcU5s7woSNiQCpMqTvngZ9IKdy2cQQ33zmEff022BQJgS5H0xrOkTpYtGpRGOmMAq9Wj1EW+Ob6CyrEAWong1rRWcMZg21LrJwfgGkwSNVcrL5R0L3ADQDEkgqf+cZBPLIzDsEZbn9gBLdc042lc31QkrImYbLvi7m1icctieKOBw9VqCSuw6VroICnGGGe68rBlPXSKQCL5vgbHADZ+EcpZAWMc8BwVf69W2J4+Ok4erpMzOo0cHDQwfd+MwzBAdNgEG4CSZ9Pk3aHnoAtnBOA363IrxW6bXzFl9MXudC/MdW9dFIRAj6OoxcEmpxUWR/wHugAEE8pPPdaGjv2JLHz1RT2HrLR2SaQtvW8g7aQwFN7kvjkTfuxtMeHE5f5sWqRHzM7jOwdSgUI3moB0NeeO8OPWZ0+HBxIwTJ40WtrnNnXPJdQHAegKRmPApf9z55mYe5MX8FLaJmqzyvuePy5BO5+YhxP7k5iX78N29EehmXqH+82OQNG4woP70xg01NxcM4wvV3gpKUBXHBKGBedmnNPFaFlHoMXFfT7BJbPC2HvgSR8pucNTALwZTSF0fyo08Z76ThjyGQkjprnh9/iLX2Z3gplLvC33jOCx3bFkXG0xgkF9BxLuFm6Yo9LcCASzB2TSBLu2xrDvVtiuPVuH664sB0XnxmF4K3VBt59HL80insf7wcY1Wnny+NGDQ6YMCZSeNloZw2Ddn+W9gRyU0Sb0AAEZKtweB4gA6MSN/2sH79+bBwAEA5whPy6oFOp6nwjd03XHRVANMQBMOzZl8H//u4hrN80hn+8vAurFvqywqvJJZomjd45S+eGYBpF8zYbKDMv28xCQK1uaz51vXS6UMIyGY6a17z996aycq5/FGnwn3gugQ+tfQO/engM4SBHJKg1jFSU8/u5jjOUAyr/7x6w0iWBAYuhM2rg6ZeT+MiX38RP7x8BZzmukSWNhKZ5wLyZfnS2W7Ad5U68bdylq2sIRcG5AC/XTEgVBg9VIxO1pmQwBtiSMKPdwOJuf1P23wNSEbDl+SR2vpICZ8Cdj4zjY1/dj4FRiWlRI8v+Pfvudf+MxBVGYhK2QwVCwADYDmE0rjAck0hmKCtgnt13JCEc4DAEw5du6cOXf9IPzoG9h208uiuB0ZhsKqDkBYaiYRPLekK5gFBdzL6J6SMo5BeNxQEmMCWDAchkFObOCCISFA3bf+9rR2ISn//2ITy2K46An+P0lUFs35OE3+IwDQ1U1sfmDIm0QiojMX+mhWMW+XDGqiCe35vG7Q+Moi2kZ2SNxiU+fEE7Tl7ux2PPJvDca2m8sDcNxoBwkGe9WM+lnN4ucPv9I9jXZ2P362kcHLQxb6aJf//8HKxc4Gv82ZQe17ViYQh/2DGQJwATIXjlTUnxkUblmTqtHY/CoCNfzdp/T9V/+44hPLgjhjnTTTiS8PDOOII+DkMUFoIqpYXlmEU+/PV72vHuE0LojGrAb71nBE6eFnAcwtwZJlafFsHq0yLIOITHdiXwiwdH8dDTcZgGg9/iWXNCpAXj4Z1x+E2O6e0G9vXb+OcfHMbPrpsL02BN8wAhkPUCJpToqUkO8wpCSiRuEqZkEAiCA8ctCTZl/717fGl/GqFADoxwIDfSwFP5sYSC32L4+0s78Td/1pF14dI2wRBAxi4yAUz/TirAkQo+k+O8E0I474QQ7t0Sw4239+PNfhttoVzWTin93ZRnHvYPOEhmKOti1ivfnilcuSCCjoiJVFrqzqZJBJ65pJUPjztI2wqct2pKRqm9YowglUJbWGDZ3GCT9l9f7NzjQiCVE6D86Blj2pYfu9iPH/1jD666ZBoMwbLCUi8JJNetVAr403eF8fM1c7H6tEhJw6gneIwByQzhXSsCWiAbdG50HoLQ0WZi/swgMhnllmVQaStZnRPEqGKGUGtIx1EYHsuAS0UYHHUwNCp1AwWbhPEoDLAdYGaHhbawDj426jJ5hZhXru7AqkU+JFKq5Bqc6VW+apEfxy32Z4GsBHr1Mi/9otI2YUaHgU9dMq2iF6kkEPJzfOGy6To+0IQ3oHkDw8LuAGypymxuUf/ouKqrHsBYLIP+4RTSGamzgYwBYwkHhwczSKRU1qelFo1H4WBIZyRWzA/AFAxKNfeCGAN27Eliz5sZ+C1e8k6k0rb5to3DuOL6fRgaldnATXP1AoDPZLjz0TFc/pV9BaaoQDgFMBaX2Lgl1nx2wz3puGVtyG4wQvW7dKXzGQsP5RywbYXDwykMjGb0++TerGDSBZm2JPSPOOgftWG7WbHmBh+WRlgYA45fEm4+AeTeyvd/O4y0TShu/PCEVimgPSyw9YUkete8gWdeSWWFoN5vzc8lfO0XA7j2+4dhS4IQLNtmlv9qFAEBH8dtG0cwEpPgvHF30HvXqxZFEA0akI6qlQ+uG3gire4PDiaRTDkQLNv9gYJlxJgWvVhS4dCgjdFxGwCV6bJprGZAKcBvcSyY7W+KACqlX/jWF5J45Jk4okFesKoJQCJNbqwfcCQQCQoMjEpc8ZV9+OVDY9kwcS1gpNQvbSyhcNXXD+B7dw0h5Nf+v8cjYgmFZDpHJIn08+3rt7F+0xgYmgsKAUBXuw/T2y3Y0rt+5fda1hDnkWFNiB0cGkxhZDyTXehEuXN5uYShPkhheNzGocEMYgnpNmmg4WIRxoCMVJg1zUTPjOYSQN59/XbzuA7iuKuFcyCVISzv8eGmT81EOCAwllCwTN0i7rMYDIPhH79/CF/5SX/2fmQZdLxb8lkMz72exmXr3sSDO+KYFjVy2/QwHW6++MwoLjotjFhSZReHJILfx3HPk+NwJDXcmuYlhnwWx/L5YWRsWTqri1AdeMpprmTawaGhFPpH0rAdBVFhUypeWrmVuzznDLajMDCSQd9QBslUniDUWTPAGJDOKCybG8wmgFiDASDBGWJJhcd3JxD082z5mOYWCr3nRbH6tAhu+cIcrFroR/+Ik+UajAFtYYEf3zuMj92wH7GkQtjPsyvUmxXw6oEMAOCn94/iyq/ux+uHMuiICK36uXb14imFqy6ZhhuvmonPfrBTZ+5ULpgTsBhe3p/B7tfTWguo5hJDxy1pg1QKrF5mnwe87UgMjKRxeCiNZMoBdxtBFMo3pXCqUVzgAZ5MK/QN2+gbziCZllkVU6swgRFAirL2nxo0jt7hz+9NY1+fDcvI+dgpW2H+LBPnnxiCVMCK+T7cem03PnB2FAMjejKIB0RHVODJ55O44vp9ePrlFAI+PexBEWAYDHsP2fj0vx3Al35wGBmHEPJz2JJgCoZ4SsEyGL76P2bhC5dNhy0J3V0mzjomhHgqpwU4Z0imFB5/LulyA2oq1nHM0giCPgNKUnngqTLwBwdSGI/bYG6jDSp5by7wRnnwSrNJ3qpPpgmJtELAYmgLGvD7WJZ8VQoAWSbDkp7mEkCKCBwMO/akYDt6tSpJrlASTlwWQHtYZP32SIDja5+ehSXdFr51xyBMQ+f+HQl0hDle3p/Bnn0ZBHw5byToY9i9NwXbAbrahJtEAkzBMDwusbTHwk2fmoWVC3xwJGVLuc4+LoiNW8bBGYOCbg83DIanXkqCqKPhOkfPNPbMCKKzzcTgaAaGwYprbnN4MCBjS4zFHcSTDpSi3MKsNOWtKL9j1Dv+jfL75kkLQiqdgc9kCAcFQn6uGWdeVI4xgi0JnVETc2c2lwDyXuKzr6U0+ETZ6xBpAfDK2jyWrgi46pJpWNxtYe2tfRiJSQT9mjhaJivdc5J0uZgpci4jETA05uBPTgrjxk/N0sRT6uM8wTl2kV9HJWVuGx2fyfDSvgySaULQ32hEUAt8wCewsDuEAwMpmKZREKrnTO+nmkg7GE84SKVlE8ATiraMoYrMniqMK/XcrrStOcLBgQxGxiSk9Hr8dA18KqOwZG4A0ZBo2P57GkNKwkhMFhRhKEXwmQxHzfO5K5LlDXYA0hnCBSeH8Z/XdGNmhwHbDf9WmrjqCU4+GJ+8eBr+4+o5iAS08AhRqKrnzzLR1W7kMfacuRxPyOYKRFzecvyyNjhS8wCWN+ZuPJHBocEk+obSSCSdLLOvOMa3Yjpfvwhefj4vlRaDVIhEZad1OIThcRsHBtLoH7WRTKssUEfNCzZt/xkD4mnC3sOF9t92CJ1tBhbMMqGUV2ufA8FnefF1H67+0HSUBNcqahxdMv4X50RxzWXTC8LE2SJR10QEfRwLZ1vZ3IKnSYbHJV4/bNc1D6oSD1ixMArL0PBkbIWh0TQODiQxMJrWKWOgSeALtbxRTd03UpHirTwFYDzhIJYEfKZm7Eu6g0ALyqfLvSyfqaeBeDX1UhJeP2Rj16spvPhmBjtfSeG1gxk9z4fqizmE/Bx3PjKGgVGJc48PYvEcC0u6LQR8vIDFeBlKKnNfzZa6eSZy/uwgBGfY15+AIxWUdOcgZBsYquytXCtimycWRsUVP4GJl555SKYl/BbHsnnBCRWAlnOnvHxCPEV47VAae95MY8eeFJ59LYU3DtsYTygQ6TJvT0gaicoqBdz9xDh+9/g4/D6GOZ0GVi7w48RlfpywJIC5M0xEQ7kAUT333EhiaHq7hc52C6/sG0ckZILxXPl+deBRdcVTuaLQAm2BZgcfFt6Zxw+OXRJGV4ep/e0mBECR7qvPX1FebCCZJlx+/T4cGLCRyugvt0wNeHtY5O0hhIbUsXebbW5NoCLCgQEHrx0cx68fG0PIzzEtKnD0Aj9eO5hxK3kLrxEK8AkVuBqC4eQVHXjs6X5wEByiupl9pdRxuTiAURoHYC2ZeMmZTjku7QmCMwYpKUuiGmujAjbvTmA8oQrcKi+Hf2DAhmXqgo1CnpFrdXekVxfIalbzevl9U+QyYgza1Pgt/TslCUNjEg9si8FnFZaYeyZr87MJrFrom1Djw4qFEbDyW2o1ATyVxbT2mDhqblgkueNoT10RbSr9o5QmZL/ZPI5rvnsIQR8vSbIwpld8schmbELa1jkIy2TobBMQTK+s8aSqaJ+JNHkMWAKDYw7icQnOWFarCE8gOGAx/bviEnNFQDDA8X9u78fAqINrP9zVcImYJ+gnrehANOzlBagEw1rxmybiABOZeFn4C0cqREMCxy0LFzxU3ezfZePf2DAISzAIUcGuEpC0CRlbgUj3AMyZbmLlAh9OWhbAUfMsLJxtgTHgmu8ewuZnEwi5VUTM21/R9SykJPgtjh9d243xhMKOPUm8tD+DXa+k8EafjZGYdu0MUZ1XKAVMiwj8ZOMI3n9mVJeRK9TNQ7zi0p4ZASzqDmL3a6MI+kQeiZ0o8FShM6jWeNhawOdFqRIZhZULQ+jp8ruFJk34/wpIZRRMI+ffF2sAKYHFcywct8SPZT3636U9Pq2u8z7JNOGFN9Lwea4kAOmGqT0iZ5kcb/bZ2PlKCn92RgRHL/SVeBY79qTwyoEMXj+UyfKO4vtmHDC4niLqucONE1+CaXCceFQ7nnpxGGGfAQXVOPA1uJ3RqhWf/yXMHe22qNvrACatPhvKjOmau784pw3f/OUAwgEO02C6eSJP0MbTEtf81WycdWywtFzLTUWbBsPvd8QwOCoRCXJI14+PBjn8FsPBQQd+S0fY/CbDD+8ZxgUnh8GF28otGBZ3W1jcbeHPz9Ym7YU30rji+n1wZI40ekKVTirEkgrnnxjGqoX+pgJg3ttdubANpArn+pTDhBrev4DyBkQ0tC9d9SygtyGtlISTlkebCobkD2+++kOd+NIVXTjt6CC6u8yCmn5yI4C3/34EgO479Or0ONdlZELoINUPfzesOQS0BzGekFh9WgQ3//0cdxy8Fpqgn2PXKyncvz2miSDlbLtUml8AwJO7kxiJSRh5xFaSzkWcsSqIK1d34FufnY2AT3OUhiOg7vEnHNWBgF/k1T8UYlK2MqBago4oT+F7kcAWAe/9l+MotIUMnLGqvSn1X/wSPnnxNPzwH7rxuQ92IpFSWW3iaYkHt8fxwHY9pTO/3lC6371xawy7Xk3pNLDSwtkeFrj0vCiWdFt4/1kRjMWlziW4jP+Hdw+7tQdu2tTNLFomw75+G991C0U8uywEQywhccEpYdzyhW6s/fgMREO8qfrH/BrIZfPCWDYvglTaces1mwQe5c7Nqwegih0/tb8kXwRYUWKDsYlPAJBSr77zTgjhmMV+xNO5FKwH2PW39WFoTKepFRVWCf/w7mHN2F2gxuISF58RwaI5FhQBn1jdgWhIQErKRgJ3vZLCxq0xcOZyhbz07vW39WN4XBaYIykJ0ZDA5e9t151EDmW5RvMlglQwtpeINQ88lRcaXrvkuJF96ZAtm0qmHVz9rRcxFncmPH5FCH1ty2S4cnUHUmmVDSoRAT4fw4EBB/90y+HsdzluUmrj1hh2vZLSq1XlgPr4RR3ZKZ/zZ5m4+IycFlDFWoBpQA3B8P3fDOP+rbFsCtrzCkZdoVowy9Q5AYNNaMKIN1Dquu/uws6XRhD0CyhSLQM+WwvaWMlxZeDz/yIVIRI0sO35UXzpey/pQJCiCc7e0yv7wlPCeNfKIMYTueyglDpq9+D2OL78435d3y8Y0nbl1T/fTSJxd9zrxy+qoAW2aC1gGgz//cgYvvnLAbRHRK4FzdUy09sMfOJ9HWiy4bnIhdap7Vt//Sq+/6tXMK3NglNcBFltChgV1mNUm9jCS/3DWtuU17EhMnQUcEaHiZ/ffxDfueMNGC4Zm1BGyI3tr/noDJhGruTLC5+2hTluu28Yf//vh5CxCZt2xLHz5cqrn+W1kZXTApbJ8cO7h5HKKPznb4bxpVsOw2cWOvMG16v/6g9Nx9wZ5oRnHkipNc3mZwbwxW8/g64OC7IY/GoZPqowRKqClhdtC1evFVYEwhd1uxRZ9ZHmDfQQKgUEAwK/3zqIVYsjWDY35BZMsqZJoVRAV7tAe1jgt5vHso2m3lcH/QJPvZTEk7uTePy5pC7cdGcDDY1LfPDcNnzg7ChU/pAH8vYLsvCrR8ayj2kIhpGYwv3b4vjt5nEEiqKRpsHQN+zgL9/dhs//Zacb7mYTUvtCMOw7nMCHvviovh5nDU1xpzra+xjjUHYMyolDtC28aK2wohBWFEV7nzQ22ZrKj5RhblzgD9uG8CendGqJVs0lhjzfXyrg2MV+xJKEzbsSCBcJQSggcGDAwVhCZuP0HvP/t7+bhVCAF8q6G2TqiAjEU4TNz+mGU0+dD4xIBAO8QP513t/Bu1YGcdOnZsE0dKq2WfXvvb5URuGj1z2Bl94YR8hvuAWw9QBf/5a1WgDiUHbcawxB9Q2iq6l7KrftSU79KAX4TY6hsQw+/393t4QUesMZvnRFFz62ugMDI3pPQJanRgNWLmjEOZB2CPNmmhgckxhPKAiRq53nDEimFF45oGsF89k9APgtVjDq3TQ0+CcvD+J7V89xR8tgwqSPc4Z//u5OPPp0P9rDpqv6myd41RtLXK9t3nnfJjPcDSvSDaXsnLFtYiZQtRm3Wl1m8FfvmY1vXX00HNfWYYKz/zgHvvyTfvzgt0PoajfKFy+54DguwetqN7BojqWLOdxj9/XbODTkIJFWCPl5RQE1BEP/iIPTjs6B30icvxLpMwTDrXe9is9/bTtmdvrhOKrxFV9X5zABTMBOHIaTPOxxgCi4LwqQbBJ4VGhbKgzNRkMGnnh2BCG/wGmrOrJTuyYSJCIA7z4+BL+PY/OuRDYoUym44vUYvHowg9cP2dh7WP/EkwqCs7K5/XweOhKT+MDZUXzt07NaAn6O9PXjb7+8BR1Ryy0HbzXwOd2cNQFOHCK6cPVabkUgfBE33cYmCHzlihSlCKGAgd9vHdCkcN7ESaE3MuaUowI4fmkAD++MI52pfk0hGHyWBtv78QSRqnyXLQn/8Ndd+MJl07OCMhHwC0jfP+SRvorx/maBLzw3SwLtWN6MoAYmfZbYnToLEL2CDcviuPqbu7HnjXi2fx8TrBmUCjh1RRCBoq5hrzzNEKxgCzmlCn+yTRbuEGnvvPxEj1LAKSsCLqmcmM337jGZlrjq+i3oH07DZ/FcsKcg3l+fS1fOjS/fT0R508IxmcBTybhSRTrnPjSWwee+/mxLSKGXPEpmFGxHd/uYLojJDCFjEwZGHYwn9N+lynX4cpabNqbbvwhDow4SaUI6k8smeiVu3miZiQZ7sqTv5mc06YuYOX9/UoEvxMR1AyN5biCrPiW0gYqUSqrL2zblpX1x9A2l8b4zZ2rXcAKmgJSu5ulsM3DvkzHEUoTxhMKVF7Xjix/uQk+XCb/FkUzrWvuxuIItCbajh0D4fQyRgMDyuT5cdGoE//OD03Dy8gA2bo0hltTX+sSfdeCD57YVTCOdKOn71x88q0mfrWqkdhtX9ahYr5mLAxi1yFsrgc+/vu0QZnRY+Nl9+7F8fhif6V04Ic/AC9BcfEYEszsNPLorgaXdFt53egSAjhsAelJ4LKnwxmE7214lpZ4C0hk13OGQuc+8mSYeezZ3LSpUm00UfOZI3xe//RS62n2QLvj1E7zmgC+n6dnc875JZmgOrHA3KOsGTh7wxX/gjGE84eDW607Ae0/tmrB7WC4Uq2sEdFt5PUpGKtIjYxlaupOIl+DZdziOiz6zCWMxG5bBISv1Z9bN7OsF3gsEGbATh+AkD4OXY/ZUYRJFrSERzW1ioFu8rv7GLuzrS7m9dzThIJEj8zqFeI7Y5c/88wigVCgo7hScZTlC8bUmOsgaAD574zYcHkzBZ3FIUjW5V3k738SU0OwhVQdEUO2MU0uAzw1WsCyOwTEbf3fjM0ilZdNVRPnmwBDlS8A9AucNgeLc/e8KxK7atRpV/YIz/PN3nsZD2w6jPWIWZvgaJniVCz6qRWyLz+RUPAa+AZeuFZsYeMGQ9pCBx54ZxHXff0F3ASvCH8vHC/b8/N7XcfOGPWXSuy1w6Wq48VShlYzXs8d8JZeOSuxVM7tX6HNtR6Grw4cf3Pk6fvTbvRCCZXPub2vw3WDP0y8M4ep/2462sJkbHNFSl6685+Cp+0qY8MZ8+QaHF9YBfP650lGY3mHhn27ejcd3Dukg0dtYCLzZf4MjaXxs7ePuNA+mq3xbDjw1BHyWhE+c4FXfl64e4AtEiwDL4Ljqhqewry+pizPehuYguyczgL/5l8dxoC+BgCWgpJpE4D11XxuTUhPQEoKH+mbZV7lBpRR8FkPfSBqf/urTLSGFb5nq5wxf+s7T+MO2w2gLGaWkr0Kypnngq7SMV9DyvPXMfmKbGHiRsvawiUefGcB139v9tiOFOdL3Gm7+xQvojFpFfKZ1Ll1l4Gvt+VA8IaQFLl0rNjHw/mI7EjM6LPznf7+GH/3m7UMKC0jf17ejPWLlTQtrvUtXH/Bl8PQ22KqYeKCJM/t6+wvKDqImQDqErg4L135nFzbvHDziSWEB6VvzWHaEG9FUuHSNnUs5EojyGSe0htlX6y+oBHxBfJsIPpPjqn/dgX19iSOWFJaSvqSeRaimzqWrldUtGwcoDQK1GnhqGPj8/6NIzxrqH0rh0/+6A0mXFKq83TuOhJ8c6XsKf9h6CG1hQ5usyXTpUD/wlYZF8srx/om5dJV2qaImpFdKhbaISwr/41m9t6+7B8CR8mMIhp/d8xpuXv8COtssOA5NvktXI35TEfiCCSGEOmYCNZpxKmWfVMcwymojTmxHoWuaD7f896s4akEUve/pyZZQFTePTK3d1xm+518dwTXf2Ia2kKW1U0PpWdSX4aszM0sNDP1g3Wd/XZnhOcwKz86lg6cM+OqFD5UmXUhJ6IiaBfsI1F/EgjpyHI2ltHWBiQPpKM1RiCYR+Mr3T3XNb3DTwck+OMnDZOjZ6/VsT9bYkIjJAD471cIAhsYyLRqU0BpNJzjARfGA6HoaaqYK+HLX58wgkvtJZrpJ01VGjVak1AK+zhfQyAg0b/5fxQVe9lxW5uVVrwSuaU4or427hArVZ+aaAx4VWX1t4AEiRSRtRiT3G4xhP4BuIip9S3VWpLQO+PptHanWrPpWlVo3qu0mAnzVbfvqeG7KrYj9HMSfI3JAehDNpLp05eIMtc+tzJ5bMyxhsipup96lq9Uynp0OQw4ROQCx5zgHe5JkBpBprVOpdrZqQsATVR9wXPXcVgLfQC/dVGTpmnXpqIYbX3B73sAjm5GyQYw/aXCf9bCTTqSVk/AJI+BuLjK5Ll1rJl42quoxhYWXb41LV/ncvFwE41AyxZWTTJuW8TAPdXS9AlIvk5NEbvnXsy9dfeHLmiu+jq3pyxmMlqz4SSy8nGiWjqhWEIcaOLfgvhTJJAB6edq4eIXv3nBpBkz8jlQaJFMqGwdoGHhqLfBUz7kTG48ymYWXjcfs6wS+htBT1XZwBnIyipQNMPa73bvXZTgACNP4sUyPS5keFTo6XIPgofasgJYDPwnjUaam8LLOcycKPFV5Z965jEM540LZcamU78e6IKS3V7zx4Od2g+Qj5CQYKUc2TPCqegWN9RBSky9ganrppi5LN2HgS7K6DFCOVDLFiNQjQ0+v243eXsGBXn0s9/2LtBOQ6RGAidxOc++4dEe0S4e6zJxe/dIeg3KSIG7+i/59Lzg2XCqxZg3f//DnNimZuU9mhgXJjATxd1y6I96lq1foGUhmpMqMC5Lp+wa3f3kTsIZjw6XSrQlcC3eOy2dVJm7LRB8D49Q08FSv0NAUMfu3tvCyJsGroxmnOeC9kzjJ9BBTdtwmw/wsAGAN8opC1zGF3vXiwKb/9SKDul45cS7TQ5IxkXeT77h0R5RLV8dzExGIccj0iFROgjPQ9YPbvvIietcLrFunSjfy7F0vsKFXdZ9100ZuhC4ww90OEz5Dzw5ijQdxGty9olpcvLUx+yM9S4cKgZxq5xY1gLp2n5y0I1OHDekk7h946oYLgUs5sEGWzgoGgA3PEcBgWdblyon3OfGDBilHEhN5r+Idl+6IcOkqCQ0BBD1ClZQjZbrfkE6yj1vscr3eV1KZvgDvs05hzRr22oOfP8yYuthxYsOZ2JuClCP1vmXqHZfuiHDpqp2rACZASkqZOCiUnRhWSl7c9+QNh7FmDQPWqeL5SqWf3vUCGy6Vs8656RRG2GgY4Q4jOMvhwm8QOTVToC2P2b+V6dk6cxWNx+zrUPV1PDsVCyUzQDLtyGSfoZz4sCK6cPDpr25Fb6/Ahg2y3ICt8p9z1xh4aJ3Tc/pNpyjO7uKGb7bwT3MMX4cgUiybNJpM4CdlPEotO99swuUtBh4cYJxUekSqzLChnPRBBbpk8OmvbvWwLAdz5Z389j6k0LtejG385L6OBefcLiWtIpVZpmSKcRGQnBs8F/1j72TpJpSlmwjwTK96sqVK9nFlj3MlMxsh2OrBp27QjP/uz1Tcybr2BBzXHADA7DNvWgtS1wojaHFfmxJWOzEuOJHUGoGqlea+nYCfBGZf89x6PAIqhI5xgnKUtMeYyoxxcpIZELuh/5kb3MBOr8hn/I1pAO+zewMBazjwB8TePPMP7T0X3ikps1DJxDIlk5xUmjFuOoyZYIwDjFjpAzRbD0BlXMkGhaaqK0l1DFWeiNA00q5dSWhY3kp3QWeMSNlSZYaFSo9wlRljIPserlhv384b1rvFjhy4WdUzZLP+T742OPvG90Kqa0B0vjDDHMICN/zgIqAYNwlcMBAxxvSWHI2pPSpfeFlatFhz1VOdBBKoUFZO9dVEli0qp4JgbN2+fOG5bpMBSSLlMFJJTk4KJDNQTkyBiQfB+U3926+/rxgj1DlltcHPGg6szW5k13POt49RduIjBHkRES3jht/HuAkdRQTAzbrHyzXEsGutPEzg3LqZfRPBq4rPXV4ode2eLtUjlQE5qTSB7eFM3APh/6++7dftco9lwNoSN28SBKAwapjd0fDcTUYP7VjhSHkGI3WiUs4JIDWHMd5NJCm7d3y1SQ8NTimvH/jGr1/Zo0FzbnCtOnMqaTbRgw1J7QfhAIR4ihHfAe7b3Bc++3k8dJ6TBb73Ul7Oxavn8/8AOc3ifRz5zNAAAAAASUVORK5CYII="},"extension.js":{"encoding":"utf8","content":"// Kubernetes Tools: the everyday kubectl commands from the command palette. Each one is typed in the terminal where you can see it.\n// Deleting and applying ask first, and show the exact command.\n\nconst SAFE = /^[A-Za-z0-9][A-Za-z0-9_.:/@=-]{0,200}$/;\nconst safeName = (s) => (SAFE.test(String(s || '').trim()) ? String(s).trim() : null);\n\n/** `kubectl` with the namespace and context from the settings. Both are checked before they go into a command. */\nfunction base(ns, ctx) {\n  let c = 'kubectl';\n  if (ctx && safeName(ctx)) c += ' --context ' + safeName(ctx);\n  if (ns && safeName(ns)) c += ' -n ' + safeName(ns);\n  return c;\n}\n\nfunction actions(k) {\n  return [\n    { id: 'pods', title: 'Get Pods', cmd: k + ' get pods -o wide' },\n    { id: 'services', title: 'Get Services', cmd: k + ' get svc' },\n    { id: 'deployments', title: 'Get Deployments', cmd: k + ' get deploy' },\n    { id: 'ingress', title: 'Get Ingresses', cmd: k + ' get ingress' },\n    { id: 'all', title: 'Get Everything in the Namespace', cmd: k + ' get all' },\n    { id: 'nodes', title: 'Get Nodes', cmd: 'kubectl get nodes -o wide' },\n    { id: 'events', title: 'Show Recent Events', cmd: k + ' get events --sort-by=.lastTimestamp' },\n    { id: 'top', title: 'Show Pod CPU and Memory', cmd: k + ' top pods' },\n    { id: 'describe', title: 'Describe a Pod...', cmd: k + ' describe pod {name}', ask: 'pod' },\n    { id: 'logs', title: 'Follow Logs of a Pod...', cmd: k + ' logs -f --tail=200 {name}', ask: 'pod' },\n    { id: 'logsPrev', title: 'Show Logs of a Crashed Pod...', cmd: k + ' logs --previous --tail=200 {name}', ask: 'pod' },\n    { id: 'exec', title: 'Open a Shell in a Pod...', cmd: k + ' exec -it {name} -- sh', ask: 'pod' },\n    { id: 'restart', title: 'Restart a Deployment...', cmd: k + ' rollout restart deployment/{name}', ask: 'deployment', confirm: 'Restart the deployment {name}?' },\n    { id: 'rolloutStatus', title: 'Watch a Rollout...', cmd: k + ' rollout status deployment/{name}', ask: 'deployment' },\n    { id: 'rollback', title: 'Undo the Last Rollout...', cmd: k + ' rollout undo deployment/{name}', ask: 'deployment', confirm: 'Roll back the deployment {name} to the previous revision?' },\n    { id: 'scale', title: 'Scale a Deployment...', cmd: k + ' scale deployment/{name} --replicas={n}', ask: 'deployment', askNumber: 'how many replicas', confirm: 'Scale {name}?' },\n    { id: 'portForward', title: 'Forward a Port from a Pod...', cmd: k + ' port-forward {name} {port}:{port}', ask: 'pod', askPort: true },\n    { id: 'deletePod', title: 'Delete a Pod...', cmd: k + ' delete pod {name}', ask: 'pod', confirm: 'Delete the pod {name}? A deployment will start a new one.' },\n    { id: 'contexts', title: 'List Contexts', cmd: 'kubectl config get-contexts' },\n    { id: 'useContext', title: 'Switch Context...', cmd: 'kubectl config use-context {name}', ask: 'context', confirm: 'Switch the kubectl context to {name}?' },\n    { id: 'namespaces', title: 'List Namespaces', cmd: 'kubectl get namespaces' },\n    { id: 'setNamespace', title: 'Set the Default Namespace...', cmd: 'kubectl config set-context --current --namespace={name}', ask: 'namespace' },\n  ];\n}\n\nfunction build(a, name, extra = {}) {\n  if (!a.ask) return a.cmd;\n  const n = safeName(name);\n  if (!n) return null;\n  let cmd = a.cmd.replace(/\\{name\\}/g, n);\n  if (a.askNumber) {\n    const r = Number(extra.n);\n    if (!Number.isInteger(r) || r < 0 || r > 1000) return null;\n    cmd = cmd.replace('{n}', String(r));\n  }\n  if (a.askPort) {\n    const p = Number(extra.port);\n    if (!Number.isInteger(p) || p < 1 || p > 65535) return null;\n    cmd = cmd.replace(/\\{port\\}/g, String(p));\n  }\n  return cmd;\n}\n\nexports._test = { base, actions, build, safeName };\n\nexports.activate = function (context) {\n  const k = () => base(ferrum.settings.get('kubectlTools.namespace'), ferrum.settings.get('kubectlTools.context'));\n\n  async function run(a) {\n    let name = '';\n    const extra = {};\n    if (a.ask) {\n      name = ((await ferrum.window.showInputBox({ prompt: 'Name of the ' + a.ask })) || '').trim();\n      if (!name) return;\n      if (a.askNumber) {\n        extra.n = await ferrum.window.showInputBox({ prompt: 'How many ' + a.askNumber.replace('how many ', '') + '?', value: '2' });\n        if (extra.n === undefined) return;\n      }\n      if (a.askPort) {\n        extra.port = await ferrum.window.showInputBox({ prompt: 'Port number', value: '8080' });\n        if (extra.port === undefined) return;\n      }\n    }\n    const cmd = build(a, name, extra);\n    if (!cmd) return ferrum.window.showMessage('I could not make a safe command from that. Names use letters, digits and . _ - : / @ = only.', 'warn');\n    if (a.confirm && !(await ferrum.window.confirm(a.confirm.replace('{name}', name) + '\\n\\n' + cmd, 'Run it'))) return;\n    await ferrum.terminal.run(cmd);\n  }\n\n  for (const a of actions('kubectl')) context.subscriptions.push(ferrum.commands.register('kubectlTools.' + a.id, () => run(actions(k()).find((x) => x.id === a.id))));\n\n  /** apply or delete the YAML file that is open. */\n  async function manifest(verb) {\n    const doc = await ferrum.editor.active();\n    if (!doc || !doc.path || !/\\.ya?ml$/i.test(doc.path)) return ferrum.window.showMessage('Open a Kubernetes YAML file first.', 'warn');\n    if (/[\"\\n\\r$`]/.test(doc.path)) return ferrum.window.showMessage('The path of this file has characters I will not put in a command.', 'warn');\n    const dry = verb === 'apply' ? await ferrum.window.showQuickPick([{ label: 'Preview only (--dry-run=client)', dry: true }, { label: 'Apply for real', dry: false }], { placeholder: 'Apply ' + doc.name }) : { dry: false };\n    if (!dry) return;\n    const cmd = k() + ' ' + verb + ' -f \"' + doc.path + '\"' + (dry.dry ? ' --dry-run=client' : '');\n    if (!dry.dry && !(await ferrum.window.confirm((verb === 'delete' ? 'Delete everything in ' : 'Apply ') + doc.name + '?\\n\\n' + cmd, verb === 'delete' ? 'Delete' : 'Apply'))) return;\n    await ferrum.terminal.run(cmd);\n  }\n  context.subscriptions.push(\n    ferrum.commands.register('kubectlTools.applyFile', () => manifest('apply')),\n    ferrum.commands.register('kubectlTools.deleteFile', () => manifest('delete')),\n    ferrum.commands.register('kubectlTools.menu', async () => {\n      const list = actions(k());\n      const pick = await ferrum.window.showQuickPick(list.map((a) => ({ label: a.title, detail: a.cmd.replace('{name}', '<name>'), id: a.id })), { placeholder: 'Kubernetes' });\n      if (pick) await run(list.find((a) => a.id === pick.id));\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Kubernetes Tools\n\nGet pods, services, deployments, ingresses, nodes and events; show CPU and memory; describe a pod; follow logs (also of a crashed pod); open a shell in a pod; restart, watch or roll back a deployment; scale; port forward; delete a pod; list and switch contexts and namespaces.\n\n- **Apply the Open YAML File...** offers a **preview** (`--dry-run=client`) or the real thing, and shows the exact command before it runs. **Delete What the Open YAML File Defines...** always asks.\n- Restart, rollback, scale, delete and context switches ask first.\n- Set a namespace or a context in the settings and every command uses it.\n- Names are checked (letters, digits and `. _ - : / @ =`), so nothing you type can add a second command.\n\nAll commands are **typed in the terminal** where you see them run.\n\n## Permissions\n\n**terminal**. It does not read output or files.\n"}}}