a,a:active,a:hover{outline:0}h1{margin:.67em 0}b,dt,strong{font-weight:700}h1 .guilabel,h2 .guilabel,h3 .guilabel,h4 .guilabel,h5 .guilabel,h6 .guilabel{font-style:italic}a>em,address,cite{font-style:normal}q{quotes:"\201C""\201D""\2018""\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}textarea{vertical-align:top}sup{top:-.5em}sub{bottom:-.25em}body.no-scroll,svg:not(:root){overflow:hidden}h1,h2,h3,hr{margin-top:20px}h1,h2,h3,h4,h5,h6,ol,ul{margin-bottom:10px}button,input,select,textarea{font-size:100%;margin:0}hr{margin-bottom:20px}button,input{line-height:normal}body{line-height:1.428571429}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}table{border-spacing:0;max-width:100%}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{background:0 0!important;box-shadow:none!important;color:#000!important;text-shadow:none!important}a,a:visited{text-decoration:underline}blockquote,pre{border:1px solid #999}thead{display:table-header-group}@page{margin:2cm .5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body,div.highlight{background-color:#fff}body{font-size:14px}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a:focus,input[type=checkbox]:focus,input[type=file]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}label{display:inline-block}hr{border-top:1px solid #eee;height:0}small{font-size:85%}div.body td{text-align:left}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#999;font-weight:400;line-height:1}h4,h5,h6{margin-top:10px}blockquote p:last-child,div.body li>p.first,li div.line-block,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address{margin-bottom:20px}dd,dt{line-height:1.428571429}blockquote{border-left:5px solid #eee;margin:0 0 20px;padding:10px 20px}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{color:#999;display:block}blockquote small:before{content:"\2014 \00A0"}blockquote:after,blockquote:before,q:after,q:before{content:""}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.fa-pull-left,.fa4-pull-left{float:left}@media (min-width:768px){.container{max-width:750px}}@media (min-width:992px){.container{max-width:970px}}label:not([for*=-message-rating]){font-weight:700;margin-bottom:5px}input[type=checkbox]{line-height:normal;margin:4px 0 0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}dl{margin-bottom:15px}input[type=checkbox][disabled]{cursor:not-allowed}dd,dd table,dd ul{margin-bottom:10px}.fa-pull-right,.fa4-pull-right{float:right}input[type=text]:disabled{color:#333}th{text-align:left}.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x,.fa4-fw,.fa4-li{text-align:center}.line-block .line-block{margin-bottom:0;margin-top:0}.fa,.fab,.fal,.far,.fas,[class*=icon-]{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;line-height:1}.far,[class*=icon-]{font-weight:400}@media (min-width:1200px){.container{max-width:1170px}}.fa-stack,.fa4{display:inline-block}@font-face{font-family:icomoon;font-style:normal;font-weight:800;src:url('/cats-d8c4vu/media.mongodb.org/fonts/icomoon.woff?qcwgdc')) format("woff"),url('/cats-d8c4vu/media.mongodb.org/fonts/icomoon.svg?qcwgdc#icomoon')) format("svg")}[class*=icon-]{speak:none;font-feature-settings:normal;font-family:icomoon}:root{--black:#001e2b;--gray-dark4:#112733;--gray-dark3:#1c2d38;--gray-dark2:#3d4f58;--gray-dark1:#5c6c75;--gray-base:#889397;--gray-light1:#c1c7c6;--gray-light2:#e8edeb;--gray-light3:#f9fbfa;--mongodb-green:#13aa52;--mongodb-green:var(--leaf);--blue-dark3:#0c2657;--blue-dark2:#083c90;--blue-dark1:#1254b7;--blue-base:#016bf8;--blue-light1:#0498ec;--blue-light2:#c3e7fe;--blue-light3:#e1f7ff;--green-dark3:#023430;--green-dark2:#00684a;--green-dark1:#00a35c;--green-base:#00ed64;--green-light1:#71f6ba;--green-light2:#c0fae6;--green-light3:#e3fcf7;--leaf:#13aa52;--fern:#12924f;--forest:#116149;--fog:#b8c4c2;--graphite:#21313c;--white:#fff;--day-spa:#e8edeb;--spring:#91c851;--daffodile:#ffdd49;--mongodb-green-light:#c2e0b4;--mongodb-green-neutral:#eff6ec;--green-secondary:#3c6626;--blush:#f4758b;--blush-light:#f9c7d0;--blush-neutral:#fdf1f2;--air:#c2deff;--air-light:#e7f0f9;--air-neutral:#f3f7fd;--marigold:#f4b65d;--marigold-light:#f6d29d;--marigold-neutral:#fff7ee;--tomato:#ef4c4c;--light-grey-green:#c2e0b4;--light-tan:#f6d29d;--charcoal-grey-two:#424950;--grey-primary:#b3bbc1;--grey-secondary:#616161;--light-grey-primary:#e0e7e8;--light-grey-secondary:#f5f6f7;--primary-shadow:rgba(0,0,0,.1);--mms-alert-blue:#43b1e5;--mms-alert-red:#ef4c4c;--mms-alert-red-dark:color(var(--alert-red) tint(25%));--mms-gray1:#464c4f;--mms-gray5:#babdbe;--mms-green2:#13aa52;--mms-warning-text:#ffb618;--sans-serif:"Euclid Circular A","Helvetica Neue",sans-serif;--monospace:"Source Code Pro",monospace;--hr-style:1px solid #e0e7e8;--hr-style:1px solid var(--light-grey-primary);--image-chevron:url('data:image/svg+xml;utf8, ') no-repeat center;--chevron-width:16px;--image-caret:url('data:image/svg+xml;utf8, ') no-repeat center;--caret-width:10px;--exclamation-circle:"\f06a";--check-circle:"\f058";--lg-color-dark-mode:var(--day-spa)} /*!
* Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/.fa,.fab,.fal,.far,.fas{font-feature-settings:normal;display:inline-block;text-rendering:auto}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x,.fa4-2x,.fa4-stack-2x{font-size:2em}.fa-3x,.fa4-3x{font-size:3em}.fa-4x,.fa4-4x{font-size:4em}.fa-5x,.fa4-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{margin-left:2.5em;padding-left:0}.fa-li{left:-2em;line-height:inherit;position:absolute;width:2em}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa.fa-pull-left,.fa4.fa4-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fa4.fa4-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin,.fa4-spin{animation:fa-spin 2s linear infinite}.fa-pulse,.fa4-pulse{animation:fa-spin 1s steps(8) infinite}.fa-rotate-90,.fa4-rotate-90{transform:rotate(90deg)}.fa-rotate-180,.fa4-rotate-180{transform:rotate(180deg)}.fa-rotate-270,.fa4-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal,.fa4-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical,.fa4-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90,:root .fa4-flip-horizontal,:root .fa4-flip-vertical,:root .fa4-rotate-180,:root .fa4-rotate-270,:root .fa4-rotate-90{filter:none}.fa-stack{height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa4-li{position:absolute}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;width:100%}.fa-stack-1x,.fa4-stack-1x{line-height:inherit}.fa-inverse,.fa4-inverse{color:#fff}.fa-500px:before,.fa4-500px:before{content:"\f26e"}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url('/cats-d8c4vu/use.fontawesome.com/releases/v5.3.1/webfonts/fa-brands-400.woff')) format("woff"),url('/cats-d8c4vu/use.fontawesome.com/releases/v5.3.1/webfonts/fa-regular-400.eot?#iefix')) format("embedded-opentype"),url('/cats-d8c4vu/use.fontawesome.com/releases/v5.3.1/webfonts/fa-regular-400.svg#fontawesome')) format("svg")}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url('/cats-d8c4vu/use.fontawesome.com/releases/v5.3.1/webfonts/fa-solid-900.woff')) format("woff"),url('/cats-d8c4vu/use.fontawesome.com/releases/v5.3.1/webfonts/fa-solid-900.svg#fontawesome')) format("svg")}.fa,.fas{font-weight:900} /*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:FontAwesome4;font-style:normal;font-weight:400;src:url(/docs/manual/static/fontawesome4-webfont-20fd1704ea223900efa9fd4e869efb08.woff2) format("woff2"),url(/docs/manual/static/fontawesome4-webfont-f691f37e57f04c152e2315ab7dbad881.woff) format("woff"),url(/docs/manual/static/fontawesome4-webfont-1e59d2330b4c6deb84b340635ed36249.ttf) format("truetype")}.fa4{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font:14px/1 FontAwesome4;font-size:inherit}.charts-icon,.mms-icon,.mms-org-icon{-moz-osx-font-smoothing:grayscale;display:inline-block;font-style:normal}.charts-icon,body{-webkit-font-smoothing:antialiased}.fa4-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa4-stack,img{vertical-align:middle}.fa4-fw{width:1.28571429em}.fa4-ul{margin-left:2.14285714em;padding-left:0}.fa4-li{left:-2.14285714em;top:.14285714em;width:2.14285714em}.fa4-li.fa4-lg{left:-1.85714286em}.fa4-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(359deg)}}.fa4-stack{display:inline-block;height:2em;line-height:2em;position:relative;width:2em}.fa4-stack-1x,.fa4-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mms-icon,.mms-org-icon{font-size:16px;position:relative}.mms-icon:after,.mms-org-icon:after{left:0;position:absolute;top:0}.mms-icon{font-family:MMSIcons-Regular}.mms-org-icon{font-family:MMSOrgIcons-Regular}.charts-icon{font-feature-settings:normal;font-family:ChartsIcons;font-variant:normal;line-height:1}dd{margin-top:3px}div.body{transition:opacity .25s linear}.first{margin-top:0!important}.linenos pre{background-color:transparent}dd{margin-left:30px}.line-block{display:block;margin-bottom:1em;margin-top:1em}.line-block .line-block{margin-left:1.5em}.linenos{float:left;padding-top:24px;width:2em}@media print{div.document{margin:0!important;width:100%}}div td pre{background-color:transparent}@font-face{font-family:MMSIcons-Regular;font-style:normal;font-weight:400;src:url(/docs/manual/static/MMSIcons-Regular-5bedbe88351f7667a2a81586d558e5ff.woff2) format("woff2"),url(/docs/manual/static/MMSIcons-Regular-d25e35eae17c6f40768c83dc7149b0a8.woff) format("woff"),url(/docs/manual/static/MMSIcons-Regular-960c944a07e1714bb4a828f117e5aa8b.ttf) format("truetype")}@font-face{font-family:MMSOrgIcons-Regular;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAALEAAoAAAAABlQAAAJ6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlYAgkoKgVyBbQsGAAE2AiQDCAQgBYRtBykbpAVAHoVxw11igYhF0ZQi3vhrPPy3X3rf/AkAOUCVE0nsolYFXGSMASygZQfk6qrrqjaqDkhX7+Ba23CtFxGVfT15MdkNtaQJb3gzixBFvNLIn4BP6P9zLl6J538+xwywCQysaGQzLLA1yDT6QugQD/3Y73lRtZGPXqSZh3umhMjiniq16TKd4q5sH/MRBBJVUFGtnNYrwdVBAQZdjMQgAIFBkGwxldgkJ9xQLUsJGxXKuA/UvkkAKIafukAwyWQkbANOAJAIyANj3RMCkvHD7BcFt7esqE3N6K7Oy7yGj0EMww/xIn68OP06oml0OHXiSLO9xga9aXJ5cXVOFY4u5vEhmi47mH6qhi/6XQe92B6D/J9/e1Yj59f4mfs3S6Vsab4jitvfMJWr+b1oCvCAwzE/V8Jj4ZOYGoNx39fiMELo4KXtvbbeGt95Vzk7km+1ik2YQkG44nn/ZXlrPQzX+rWHRo+hrvfcUSALLiu0Dwscz78qBl7n9taAbljT9IsV5GrQSCTuhm/rkAUkaGQLLNByTUq0cFQLt3EIAuQIBQqwsESY0hEBRqDYMgqzUNgioNZkFQrdYiCOpNaQRBgw6Yr8h1mDSUg9BqDZJmn6HQ6gzJxBtU6fYH1VrDF+qVoiPVYDQsF8dko73NbXZwSv6zLLRAPq542RlZymBFfr7ZlEOI8dAhPLUU1n7lU1p5q2cbS4S5shLQyMDJANMgDPQoWm0ojezauJkhGWuORzMwaWKnge0R4XMxnoWLEyVbhiy7uO3h8pqZ5CBFjChGmIsDpYGLkz6VnZ0LxQ1zsTLQITKYEYRbiUyZjPyeGXRcHHwA9SPfiE4K) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAQYAAoAAAAABlQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWVr1jO2NtYXAAAAE0AAAAPAAAAUoApAFvZ2x5ZgAAAXAAAADcAAAA3CHU3wZoZWFkAAACTAAAAC0AAAA2EIIX4WhoZWEAAAJ8AAAAGAAAACQIXQQDaG10eAAAApQAAAAIAAAACAgAAABsb2NhAAACnAAAAAYAAAAGAG4AAG1heHAAAAKkAAAAHgAAACABDgBVbmFtZQAAAsQAAAE7AAACbdWMZSRwb3N0AAAEAAAAABUAAAApARAAAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYPBk8WUDcGBaIMCOIAACY/wesAAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZiALM/8EqwPT/HVD1QMDIxkA9wEhYyWAEALzJBw8AAgAAAAAEAAPkACMASAAAJSYvAT4BNS4BJw4BBzM+ATceARcOAQcuAScjHgEXMjY3FzcwARYfAR4BMzI2PwEXHgE7ATUjJy4BDgEPAScuAQ8BIxUzMj8BMAQADmRyKS4E67Cj4xZpFah2hLADA7CEWIwqczDMhUiBNeVJ/TAEHiIIFw0QGgY9NAcZD2hIWgcaHxkGQzEOMBJZutAVEDtmDmRxNYBIsOkEA8qccJACA6+Eg68EAVRGc40CLinjSQHDBy0zCwwSD5doDQ9nsg4PAREPp0kUBRFYZw87eJxjYGRgYADigzb/wuP5bb4ycLMwgMC1jS8bkGkWBuYnQIqDgQnEAwBGJQrYAAAAeJxjYGRgYGEAghgwCWIzMqACJgALRgBtBAAAAAQAAAAAAAAAAG4AAHicY2BkYGBgYvAEYgYwi4GBCwgZGP6D+QwAD88BZAAAeJx1j0tOwzAQhn/3BbQSqqhgh+QFYgEofYhVN+yafRfdp63Th9I4ctxKPQDn4QicgCPQG3AHftIBoVJiefzNN5NxAuACOyjsn0vuPSucMttzCSe4Fi7T3whXyA/CVTTwKFyjfxKu4x6hcAMtOE5QlTNmd3gWVmjiRbiEc7wKl+nfhCvkd+EqrvAhXENTlYXrGKmWcAO3ahGa1LjIm6keb3WYbLO5N+77HJrZOoncoR4Zly9sqrtB56f0e0y+mfW8j3Xs7EoPbOpNklidObs0Ex/Mvc/67XYsPpjYFX/fIOV2iOB5TqExxpYxRMIzw7zw7k8+ZJxhTRsdqR7moyLmWMDyPo0uAnSOvPXf1+TY8LYerUfMPGaPxYo0KCZ+dSdcliYrakuaCX1QTPe0fbS54oP+gF2c9Ak0Y2+kAHicY2BigAAuBuwAKM8IUgMAAdYAEgAAAA==) format("woff"),url(data:font/ttf;base64,AAEAAAAKAIAAAwAgT1MvMla9YzsAAAEoAAAAVmNtYXAApAFvAAABiAAAAUpnbHlmIdTfBgAAAtwAAADcaGVhZBCCF+EAAADQAAAANmhoZWEIXQQDAAAArAAAACRobXR4CAAAAAAAAYAAAAAIbG9jYQBuAAAAAALUAAAABm1heHABDgBVAAABCAAAACBuYW1l1YxlJAAAA7gAAAJtcG9zdAEQAAAAAAYoAAAAKQABAAAEAAAAAFwEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAAAgABAAAAAQAAwT0HM18PPPUACwQAAAAAANax6YAAAAAA1rHpgAAAAAAEAAPkAAAACAACAAAAAAAAAAEAAAACAEkAAgAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQQAAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABAAEkASQQAAAAAXAQAAAAAAAABAAAAAAAABAAAAAQAAAAAAAADAAAAAwAAABwAAQAAAAAARAADAAEAAAAcAAQAKAAAAAYABAABAAIAAABJ/8AAAAAAEn/wAA/7gAAQAAAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAAAIAAAAABAAD5AAjAEgAACUmLwE+ATUuAScOAQczPgE3HgEXDgEHLgEnIx4BFzI2Nxc3MAEWHwEeATMyNj8BFx4BOwE1IycuAQ4BDwEnLgEPASMVMzI/ATAEAA5kcikuBOuwo+MWaRWodoSwAwOwhFiMKnMwzIVIgTXlSf0wBB4iCBcNEBoGPTQHGQ9oSFoHGh8ZBkMxDjASWbrQFRA7Zg5kcTWASLDpBAPKnHCQAgOvhIOvBAFURnONAi4p40kBwwctMwsMEg+XaA0PZ7IODwERD6dJFAURWGcPOwAAABIA3gABAAAAAAAAABUAAAABAAAAAAABAAgAFQABAAAAAAACAAcAHQABAAAAAAADAAgAJAABAAAAAAAEAAgALAABAAAAAAAFAAsANAABAAAAAAAGAAgAPwABAAAAAAAKACsARwABAAAAAAALABMAcgADAAEECQAAACoAhQADAAEECQABABAArwADAAEECQACAA4AvwADAAEECQADABAAzQADAAEECQAEABAA3QADAAEECQAFABYA7QADAAEECQAGABABAwADAAEECQAKAFYBEwADAAEECQALACYBaUdlbmVyYXRlZCBieSBHbHlwaHRlckdseXBodGVyUmVndWxhckdseXBodGVyR2x5cGh0ZXJWZXJzaW9uIDEuMEdseXBodGVyR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABHAGwAeQBwAGgAdABlAHIARwBsAHkAcABoAHQAZQByAFIAZQBnAHUAbABhAHIARwBsAHkAcABoAHQAZQByAEcAbAB5AHAAaAB0AGUAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAARwBsAHkAcABoAHQAZQByAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQAAAAACAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAECAAAAAAAA) format("truetype")}@font-face{font-family:ChartsIcons;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAAOMAAoAAAAAB0QAAANAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlYAgkoKg2SDQgsGAAE2AiQDCAQgBYRVBykbYQZRlCxKH+DHgd3wVQRCO8BliGUDodgsi+GD3Az/EXy/H/s99wmuybTT8IwnspdIEmt0n05ITKdbiPJ/iG9pbXsghQtJI6Zd+8mbD7FcSJTqqXBk9/4E2gugjnYlbODuVSF8SD5En+dyfOv5gc1/s+l6c1ATfIEt8l5iRel83gaPo0UJZtgwdtmTe4hc3CrUprN0Dty4x8cPGbUkRcbtv74/szA0MsoBezmAAJIMJYOlxEoUbN+WCaCUCwmLVQXpRvXoy4xFKfjzARwsgRxtwD2+AWgEtNXX1TU0cq6hrra24Zi1ZfPJBUHEEjqYDMTQQykwIWwIJ/TSimQgEBgaEQIqqItRw9lN+/oYg1Xza6lWqKD81izovmKa9l827TRW0QsrAoPumBAcWwGwBO4wGKNG1xnKiA1HHHnM0saAEWZjmyd1B04IHLmp7zlyYoSJpTMN72lLHE16BrXtaWBiZEfBJ7jg1bsIhgl5+TaUJAOxnQThFjjswm4vIxvDlgia3MLBmL2MC/vUMBRr8Ai7g86y7mzDU6CJySl/rNGBuMFFAzn7cosm3P1RydYNXJ7F/pYNcVH96um5w/q2muDp0JAs37kv3CYaNn5u5RJX/Tynai4/KH6k10LWi8ViCdC0XRg0dwpqAY1Hf5ZyhWt4F2sjZ79gG8eQ1ZcqEJ1UxGINTAbBJ65vC/AYRfDxv3PXmq3aFATCJ1+1H6xKV56ASh0h8V+DkHP+h5pGH4KzzxsEb1vbiAWgupOv5SAQbDcXnMYIWf6tJXLwcYdyjdd+NbUSCLatngrzZp7A3ZRrZ+L9JPfaABLq1QNUQ7tftwvky4RSF5IaA8iUhoicmUChwRxKpXnUmzbYo0GHSFPkdZhyAxAavSBp9opMozciZ95R6PZEqdF/1Nv1n2swFhv3w7lFciqCqDpWJfWP2Gxqp5zrr66gvHC0F8P13peI3jWU+eaoeSrj/mPXOXNNvDpz138WWHBlXBUFuSxCOyEWEieFAHxPxQgoFVRbcvl2EoqP5qNtt8/UQrkMIVC81bRjUF/b80n4czyEp5JLEXO5DHIlEjmiUMlFXAaiAggV2hjG081nUkYu1QDU77jCWB0BAAA=) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAT4AAoAAAAAB0QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWVrVjM2NtYXAAAAE0AAAAPAAAAUoAlAF3Z2x5ZgAAAXAAAAGuAAAB5GI+BANoZWFkAAADIAAAAC4AAAA2FExZ3WhoZWEAAANQAAAAHAAAACQI6gN3aG10eAAAA2wAAAAIAAAACAgAAABsb2NhAAADdAAAAAYAAAAGAPIAAG1heHAAAAN8AAAAIAAAACABHQCubmFtZQAAA5wAAAFEAAACVT7oPWZwb3N0AAAE4AAAABUAAAApARAAAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYHBkcWUDcGBaIMCOIAACXvwecAAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZiALMf/8EqwPT/A1D1QMDIxkA5YCSsZDADALO5Bwd4nC2OsW/TQBjFv89OHaglFDe5C3LatImdcyWf0BEnvShpSaHgJEKVaMXE0goJpFIhdanUobBAQQpiYoKNzVtWxF/B3oGZMLExUMPnhuWe3nu/p+/A+fsVIBfnAK7CAlRAQBN6EMMOPILH8AyO4QWcwXv4AJ8BsNnDtgisvGJVLK/ptqcaN5A8ixSrh8h4+RZq1SCMVATXMF8ucQJF25uBNJuhpfwlOldaytBAefWsa6vimiaQKa+1gTSvYqRMEWSdijKQbpvWbBtRqAPThyK5HJiEK7xjjx4OtyoGOvbWMMFT0sH9yWVoO3jxZT5+gEUnFLpvXdnQImwkpo93dT2gNiGsMerEVvq61l88lZvrlZ74/4pNvtiv7a26XXJTqrvu6nSwftuu8Sn3Ct1Xx+m39Od48OMdKmSZGjwx3f0nUh9I15zIztOgYiRyYrryQEv9XLOqHm/L3XGzyg6P5PZYL3FK5dFhpM92z+mf9lBzrmPrI57PXdcjO5mPd/L3OvbCxaew5fNly1rmfis0fnPpr9xkTqvmj/68LOB3LJy8MQrpSvrr5C0C/AMcw2JeAAB4nGNgZGBgAOIUvgrzeH6brwzcLAwgcGM6VwGM/r+LgYHFDSzOwcAEogD3nAi1AAB4nGNgZGBgYQCCGBD5v4Slh4GRARUwAQA1GAJsBAAAAAQAAAAAAAAAAPIAAAABAAAAAgCiABEAAAAAAAIAAAAKAAoAAAD/AAAAAAAAeJx1kD1Ow0AQhZ/zh0gQBQgamhUFQiA5Px1p6OKaFOkdZx0ncrzWehPJBefhAJyAA3AAGq7AAWh42FOQSHi0O9+8fTuzMoAzfMJD/V1w1eyhw6rmBo5wJdykfi3cIt8Kt9GDL9xhPAh3cY9H4R7OsWYHr3XM6g7Pwh5O8CLcwClehZvU34Rb5HfhNi7xIdyh/iXcxQzfwj3ceE+BzrQNnV6oeamCtMwTp22UhNYVU73cpqEU9T7TtliZTA39QS3sXS92y5FzsYqt2aiJyZxOU6Nya9Y6cn7iXD7u92PR/chsEEAj47II4ZgXUJij5B4gZc6RVLpFRAqZHQpMqSyxpSM8OPnLs+pegRUMZygM+fMHe47/pxfYccKIqkPMOqbHYEOaVN1+3SnDUMmrszWViLpfvdhRHaPPiA/8Pl3s9APzDmqGeJxjYGKAAC4G7AAozwhSAwAB1gASAAAA) format("woff"),url(data:font/ttf;base64,AAEAAAAKAIAAAwAgT1MvMla1YzMAAAEoAAAAVmNtYXAAlAF3AAABiAAAAUpnbHlmYj4EAwAAAtwAAAHkaGVhZBRMWd0AAADQAAAANmhoZWEI6gN3AAAArAAAACRobXR4CAAAAAAAAYAAAAAIbG9jYQDyAAAAAALUAAAABm1heHABHQCuAAABCAAAACBuYW1lPug9ZgAABMAAAAJVcG9zdAEQAAAAAAcYAAAAKQABAAAEAAAAAFwEAAAA/3QEjAABAAAAAAAAAAAAAAAAAAAAAgABAAAAAQAAZA6GO18PPPUACwQAAAAAANiXCnAAAAAA2JcKcP+6AAAERgQAAAAACAACAAAAAAAAAAEAAAACAKIAEQAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQQAAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABAAEEAQQQAAAAAXAQAAAAAAAABAAAAAAAABAAAAAQAAAAAAAADAAAAAwAAABwAAQAAAAAARAADAAEAAAAcAAQAKAAAAAYABAABAAIAAABB/8AAAAAAEH/wAA/8AAAQAAAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8gAAABH/ugAABEYEAAAJABIAGwAmADIAOwBGAFEAWgBiAGoAdQB9AIUAjQCTAKEAAAEyOwE1JicGBzAVHgEXNjc1IzAlLgEnBgcVMzAVIisBFRYXPgE3MCUyOwE+ATcmJw4BBxcUFhc2NyY1IyUuAScGBx4BFzMwFSIrARQHFz4BNzAFFB0BPgE3JzAjIgceARc1MBM2Ny4BJxUwIzQ9AQ4BBx4BMzADJicHHgEXMDM+ATcnBgcwAwYHFz4BNzAzHgEXNycDJAATPgE3BAADDgEHMAFCC0lUSEMbAgERC0NIqAF8ARELR0uvC0lUSEMLEQH9uApGUAETESsmNz8GCD03JislqAMkAUQ3IicLEQGoC0lUJUk4Rgb+hCE/HHwsQDwbOyYsQDwbOyYsJkAWHD8hXygaOhs7JuohPxw6GijqRzxBCyEW6hYjEDqDdf7Q/uuKR+mLATABFYpH6YsCFqgDGmBlLDdpLBoDryw4ZicbAqgsrwMaLGk3LDdtNxUeN4pNLFKKMh4Va3AsTYo3HRY3bTcscGszN4VS2wpGUAtINxYWN0YGmQHbBRg3SQuoCkZRB0U4CxL9mis0JBYfBgYfFiQ0KwL4FiwkIDEVETQhJEn8fhAB3wEQeIYCEP4g/vF4hwEAAAAAABIA3gABAAAAAAAAABUAAAABAAAAAAABAAYAFQABAAAAAAACAAcAGwABAAAAAAADAAYAIgABAAAAAAAEAAYAKAABAAAAAAAFAAsALgABAAAAAAAGAAYAOQABAAAAAAAKACsAPwABAAAAAAALABMAagADAAEECQAAACoAfQADAAEECQABAAwApwADAAEECQACAA4AswADAAEECQADAAwAwQADAAEECQAEAAwAzQADAAEECQAFABYA2QADAAEECQAGAAwA7wADAAEECQAKAFYA+wADAAEECQALACYBUUdlbmVyYXRlZCBieSBHbHlwaHRlcmNoYXJ0c1JlZ3VsYXJjaGFydHNjaGFydHNWZXJzaW9uIDEuMGNoYXJ0c0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAARwBsAHkAcABoAHQAZQByAGMAaABhAHIAdABzAFIAZQBnAHUAbABhAHIAYwBoAGEAcgB0AHMAYwBoAGEAcgB0AHMAVgBlAHIAcwBpAG8AbgAgADEALgAwAGMAaABhAHIAdABzAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQAAAAACAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAECAAAAAAAA) format("truetype")}@font-face{font-display:swap;font-family:Euclid Circular A;font-style:normal;font-weight:700;src:url(/docs/manual/static/EuclidCircularA-Semibold-WebXL-fa7f7a6de763f3fc0ef6d7bce19a5b97.woff) format("woff")}div.document{margin-left:25px}div.section>h1+dl.dbcommand>dt,div.section>h1+dl.expression>dt,div.section>h1+dl.group>dt,div.section>h1+dl.method>dt,div.section>h1+dl.operator>dt,div.section>h1+dl.pipeline>dt,div.section>h1+dl.projection>dt,dl.binary{display:none}.highlight ::-webkit-scrollbar{-webkit-appearance:none;height:5px;width:7px}.highlight ::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.5);border-radius:0;height:0}body{color:#21313c;font-family:Euclid Circular A,Helvetica Neue,Helvetica,Arial,sans-serif;margin:0;padding:0}hr{border:1px solid #b1b4b6}div.body h1+dl,div.body h1+p,div.body h2+dl,div.body h2+p,div.body h3+dl,div.body h3+p,div.body h4+dl,div.body h4+p{padding:0;text-indent:0}a code{font-weight:400}dl.method dt{margin-bottom:24px}dl.method>dt big{font-size:16px;font-weight:300}dl.method>dt em{font-style:normal;font-weight:700}.content{display:flex;font-size:16px;line-height:24px;margin:45px auto 0}@media (max-width:1340px){.document{margin-left:25px}}@media (min-width:1121px) and (max-width:1340px){.document{margin-left:25px}}@media (max-width:1024px){.document{margin-left:25px}}#tooltip-1{z-index:3}
/*!
* Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-ad:before{content:"\f641"}.fa-address-book:before,.fa4-address-book:before{content:"\f2b9"}.fa-address-card:before,.fa4-address-card:before,.fa4-vcard:before{content:"\f2bb"}.fa-adjust:before,.fa4-adjust:before{content:"\f042"}.fa-adn:before,.fa4-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before,.fa4-align-center:before{content:"\f037"}.fa-align-justify:before,.fa4-align-justify:before{content:"\f039"}.fa-align-left:before,.fa4-align-left:before{content:"\f036"}.fa-align-right:before,.fa4-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before,.fa4-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before,.fa4-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before,.fa4-american-sign-language-interpreting:before,.fa4-asl-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before,.fa4-anchor:before{content:"\f13d"}.fa-android:before,.fa4-android:before{content:"\f17b"}.fa-angellist:before,.fa4-angellist:before{content:"\f209"}.fa-angle-double-down:before,.fa4-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before,.fa4-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before,.fa4-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before,.fa4-angle-double-up:before{content:"\f102"}.fa-angle-down:before,.fa4-angle-down:before{content:"\f107"}.fa-angle-left:before,.fa4-angle-left:before{content:"\f104"}.fa-angle-right:before,.fa4-angle-right:before{content:"\f105"}.fa-angle-up:before,.fa4-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before,.fa4-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before,.fa4-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before,.fa4-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before,.fa4-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.fa4-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before,.fa4-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before,.fa4-arrow-down:before{content:"\f063"}.fa-arrow-left:before,.fa4-arrow-left:before{content:"\f060"}.fa-arrow-right:before,.fa4-arrow-right:before{content:"\f061"}.fa-arrow-up:before,.fa4-arrow-up:before{content:"\f062"}.fa-arrows-alt:before,.fa4-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before,.fa4-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before,.fa4-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before,.fa4-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before,.fa4-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before,.fa4-backward:before{content:"\f04a"}.fa-balance-scale:before,.fa4-balance-scale:before{content:"\f24e"}.fa-ban:before,.fa4-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before,.fa4-bandcamp:before{content:"\f2d5"}.fa-barcode:before,.fa4-barcode:before{content:"\f02a"}.fa-bars:before,.fa4-bars:before,.fa4-navicon:before,.fa4-reorder:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before,.fa4-bath:before,.fa4-bathtub:before,.fa4-s15:before{content:"\f2cd"}.fa-battery-empty:before,.fa4-battery-0:before,.fa4-battery-empty:before{content:"\f244"}.fa-battery-full:before,.fa4-battery-4:before,.fa4-battery-full:before,.fa4-battery:before{content:"\f240"}.fa-battery-half:before,.fa4-battery-2:before,.fa4-battery-half:before{content:"\f242"}.fa-battery-quarter:before,.fa4-battery-1:before,.fa4-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before,.fa4-battery-3:before,.fa4-battery-three-quarters:before{content:"\f241"}.fa-bed:before,.fa4-bed:before,.fa4-hotel:before{content:"\f236"}.fa-beer:before,.fa4-beer:before{content:"\f0fc"}.fa-behance:before,.fa4-behance:before{content:"\f1b4"}.fa-behance-square:before,.fa4-behance-square:before{content:"\f1b5"}.fa-bell:before,.fa4-bell:before{content:"\f0f3"}.fa-bell-slash:before,.fa4-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before,.fa4-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before,.fa4-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before,.fa4-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before,.fa4-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before,.fa4-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before,.fa4-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before,.fa4-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before,.fa4-bluetooth-b:before{content:"\f294"}.fa-bold:before,.fa4-bold:before{content:"\f032"}.fa-bolt:before,.fa4-bolt:before,.fa4-flash:before{content:"\f0e7"}.fa-bomb:before,.fa4-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before,.fa4-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before,.fa4-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before,.fa4-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before,.fa4-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before,.fa4-bitcoin:before,.fa4-btc:before{content:"\f15a"}.fa-bug:before,.fa4-bug:before{content:"\f188"}.fa-building:before,.fa4-building:before{content:"\f1ad"}.fa-bullhorn:before,.fa4-bullhorn:before{content:"\f0a1"}.fa-bullseye:before,.fa4-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before,.fa4-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before,.fa4-buysellads:before{content:"\f20d"}.fa-calculator:before,.fa4-calculator:before{content:"\f1ec"}.fa-calendar:before,.fa4-calendar-o:before{content:"\f133"}.fa-calendar-alt:before,.fa4-calendar:before{content:"\f073"}.fa-calendar-check:before,.fa4-calendar-check-o:before{content:"\f274"}.fa-calendar-minus:before,.fa4-calendar-minus-o:before{content:"\f272"}.fa-calendar-plus:before,.fa4-calendar-plus-o:before{content:"\f271"}.fa-calendar-times:before,.fa4-calendar-times-o:before{content:"\f273"}.fa-camera:before,.fa4-camera:before{content:"\f030"}.fa-camera-retro:before,.fa4-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before,.fa4-automobile:before,.fa4-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before,.fa4-caret-down:before{content:"\f0d7"}.fa-caret-left:before,.fa4-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.fa4-caret-right:before{content:"\f0da"}.fa-caret-square-down:before,.fa4-caret-square-o-down:before,.fa4-toggle-down:before{content:"\f150"}.fa-caret-square-left:before,.fa4-caret-square-o-left:before,.fa4-toggle-left:before{content:"\f191"}.fa-caret-square-right:before,.fa4-caret-square-o-right:before,.fa4-toggle-right:before{content:"\f152"}.fa-caret-square-up:before,.fa4-caret-square-o-up:before,.fa4-toggle-up:before{content:"\f151"}.fa-caret-up:before,.fa4-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before,.fa4-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before,.fa4-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before,.fa4-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before,.fa4-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before,.fa4-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before,.fa4-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before,.fa4-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before,.fa4-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before,.fa4-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before,.fa4-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before,.fa4-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before,.fa4-area-chart:before{content:"\f1fe"}.fa-chart-bar:before,.fa4-bar-chart-o:before,.fa4-bar-chart:before{content:"\f080"}.fa-chart-line:before,.fa4-line-chart:before{content:"\f201"}.fa-chart-pie:before,.fa4-pie-chart:before{content:"\f200"}.fa-check:before,.fa4-check:before{content:"\f00c"}.fa-check-circle:before,.fa4-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before,.fa4-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before,.fa4-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before,.fa4-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before,.fa4-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before,.fa4-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before,.fa4-chevron-down:before{content:"\f078"}.fa-chevron-left:before,.fa4-chevron-left:before{content:"\f053"}.fa-chevron-right:before,.fa4-chevron-right:before{content:"\f054"}.fa-chevron-up:before,.fa4-chevron-up:before{content:"\f077"}.fa-child:before,.fa4-child:before{content:"\f1ae"}.fa-chrome:before,.fa4-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before,.fa4-circle:before{content:"\f111"}.fa-circle-notch:before,.fa4-circle-o-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before,.fa4-clock-o:before{content:"\f017"}.fa-clone:before,.fa4-clone:before{content:"\f24d"}.fa-closed-captioning:before,.fa4-cc:before{content:"\f20a"}.fa-cloud:before,.fa4-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before,.fa4-code:before{content:"\f121"}.fa-code-branch:before,.fa4-code-fork:before{content:"\f126"}.fa-codepen:before,.fa4-codepen:before{content:"\f1cb"}.fa-codiepie:before,.fa4-codiepie:before{content:"\f284"}.fa-coffee:before,.fa4-coffee:before{content:"\f0f4"}.fa-cog:before,.fa4-cog:before,.fa4-gear:before{content:"\f013"}.fa-cogs:before,.fa4-cogs:before,.fa4-gears:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before,.fa4-columns:before{content:"\f0db"}.fa-comment:before,.fa4-comment:before{content:"\f075"}.fa-comment-alt:before,.fa4-commenting:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before,.fa4-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before,.fa4-compass:before{content:"\f14e"}.fa-compress:before,.fa4-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before,.fa4-connectdevelop:before{content:"\f20e"}.fa-contao:before,.fa4-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before,.fa4-copy:before,.fa4-files-o:before{content:"\f0c5"}.fa-copyright:before,.fa4-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before,.fa4-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before,.fa4-credit-card:before{content:"\f09d"}.fa-crop:before,.fa4-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before,.fa4-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before,.fa4-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before,.fa4-cube:before{content:"\f1b2"}.fa-cubes:before,.fa4-cubes:before{content:"\f1b3"}.fa-cut:before,.fa4-cut:before,.fa4-scissors:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before,.fa4-dashcube:before{content:"\f210"}.fa-database:before,.fa4-database:before{content:"\f1c0"}.fa-deaf:before,.fa4-deaf:before,.fa4-deafness:before,.fa4-hard-of-hearing:before{content:"\f2a4"}.fa-delicious:before,.fa4-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before,.fa4-desktop:before{content:"\f108"}.fa-deviantart:before,.fa4-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before,.fa4-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before,.fa4-dollar:before,.fa4-usd:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before,.fa4-dot-circle-o:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before,.fa4-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before,.fa4-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before,.fa4-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before,.fa4-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before,.fa4-edge:before{content:"\f282"}.fa-edit:before,.fa4-edit:before,.fa4-pencil-square-o:before{content:"\f044"}.fa-eject:before,.fa4-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before,.fa4-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before,.fa4-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before,.fa4-empire:before,.fa4-ge:before{content:"\f1d1"}.fa-envelope:before,.fa4-envelope:before{content:"\f0e0"}.fa-envelope-open:before,.fa4-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before,.fa4-envelope-square:before{content:"\f199"}.fa-envira:before,.fa4-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before,.fa4-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before,.fa4-etsy:before{content:"\f2d7"}.fa-euro-sign:before,.fa4-eur:before,.fa4-euro:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before,.fa4-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before,.fa4-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before,.fa4-exclamation-triangle:before,.fa4-warning:before{content:"\f071"}.fa-expand:before,.fa4-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before,.fa4-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before,.fa4-eye:before{content:"\f06e"}.fa-eye-dropper:before,.fa4-eyedropper:before{content:"\f1fb"}.fa-eye-slash:before,.fa4-eye-slash:before{content:"\f070"}.fa-facebook:before,.fa4-facebook-f:before,.fa4-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before,.fa4-facebook-square:before{content:"\f082"}.fa-fast-backward:before,.fa4-fast-backward:before{content:"\f049"}.fa-fast-forward:before,.fa4-fast-forward:before{content:"\f050"}.fa-fax:before,.fa4-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before,.fa4-female:before{content:"\f182"}.fa-fighter-jet:before,.fa4-fighter-jet:before{content:"\f0fb"}.fa-file:before,.fa4-file:before{content:"\f15b"}.fa-file-alt:before,.fa4-file-text:before{content:"\f15c"}.fa-file-archive:before,.fa4-file-archive-o:before,.fa4-file-zip-o:before{content:"\f1c6"}.fa-file-audio:before,.fa4-file-audio-o:before,.fa4-file-sound-o:before{content:"\f1c7"}.fa-file-code:before,.fa4-file-code-o:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before,.fa4-file-excel-o:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before,.fa4-file-image-o:before,.fa4-file-photo-o:before,.fa4-file-picture-o:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before,.fa4-file-pdf-o:before{content:"\f1c1"}.fa-file-powerpoint:before,.fa4-file-powerpoint-o:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before,.fa4-file-movie-o:before,.fa4-file-video-o:before{content:"\f1c8"}.fa-file-word:before,.fa4-file-word-o:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before,.fa4-film:before{content:"\f008"}.fa-filter:before,.fa4-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before,.fa4-fire:before{content:"\f06d"}.fa-fire-extinguisher:before,.fa4-fire-extinguisher:before{content:"\f134"}.fa-firefox:before,.fa4-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before,.fa4-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before,.fa4-flag:before{content:"\f024"}.fa-flag-checkered:before,.fa4-flag-checkered:before{content:"\f11e"}.fa-flask:before,.fa4-flask:before{content:"\f0c3"}.fa-flickr:before,.fa4-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before,.fa4-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before,.fa4-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before,.fa4-font:before{content:"\f031"}.fa-font-awesome:before,.fa4-fa:before,.fa4-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before,.fa4-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before,.fa4-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before,.fa4-forumbee:before{content:"\f211"}.fa-forward:before,.fa4-forward:before{content:"\f04e"}.fa-foursquare:before,.fa4-foursquare:before{content:"\f180"}.fa-free-code-camp:before,.fa4-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before,.fa4-frown-o:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before,.fa4-futbol-o:before,.fa4-soccer-ball-o:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before,.fa4-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before,.fa4-gavel:before,.fa4-legal:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before,.fa4-genderless:before{content:"\f22d"}.fa-get-pocket:before,.fa4-get-pocket:before{content:"\f265"}.fa-gg:before,.fa4-gg:before{content:"\f260"}.fa-gg-circle:before,.fa4-gg-circle:before{content:"\f261"}.fa-gift:before,.fa4-gift:before{content:"\f06b"}.fa-git:before,.fa4-git:before{content:"\f1d3"}.fa-git-square:before,.fa4-git-square:before{content:"\f1d2"}.fa-github:before,.fa4-github:before{content:"\f09b"}.fa-github-alt:before,.fa4-github-alt:before{content:"\f113"}.fa-github-square:before,.fa4-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before,.fa4-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before,.fa4-glass:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before,.fa4-glide:before{content:"\f2a5"}.fa-glide-g:before,.fa4-glide-g:before{content:"\f2a6"}.fa-globe:before,.fa4-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before,.fa4-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before,.fa4-google-plus-circle:before,.fa4-google-plus-official:before{content:"\f2b3"}.fa-google-plus-g:before,.fa4-google-plus:before{content:"\f0d5"}.fa-google-plus-square:before,.fa4-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before,.fa4-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before,.fa4-graduation-cap:before,.fa4-mortar-board:before{content:"\f19d"}.fa-gratipay:before,.fa4-gittip:before,.fa4-gratipay:before{content:"\f184"}.fa-grav:before,.fa4-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before,.fa4-h-square:before{content:"\f0fd"}.fa-hacker-news:before,.fa4-hacker-news:before,.fa4-y-combinator-square:before,.fa4-yc-square:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before,.fa4-hand-lizard-o:before{content:"\f258"}.fa-hand-paper:before,.fa4-hand-paper-o:before,.fa4-hand-stop-o:before{content:"\f256"}.fa-hand-peace:before,.fa4-hand-peace-o:before{content:"\f25b"}.fa-hand-point-down:before,.fa4-hand-o-down:before{content:"\f0a7"}.fa-hand-point-left:before,.fa4-hand-o-left:before{content:"\f0a5"}.fa-hand-point-right:before,.fa4-hand-o-right:before{content:"\f0a4"}.fa-hand-point-up:before,.fa4-hand-o-up:before{content:"\f0a6"}.fa-hand-pointer:before,.fa4-hand-pointer-o:before{content:"\f25a"}.fa-hand-rock:before,.fa4-hand-grab-o:before,.fa4-hand-rock-o:before{content:"\f255"}.fa-hand-scissors:before,.fa4-hand-scissors-o:before{content:"\f257"}.fa-hand-spock:before,.fa4-hand-spock-o:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before,.fa4-handshake-o:before{content:"\f2b5"}.fa-hashtag:before,.fa4-hashtag:before{content:"\f292"}.fa-haykal:before{content:"\f666"}.fa-hdd:before,.fa4-hdd-o:before{content:"\f0a0"}.fa-heading:before,.fa4-header:before{content:"\f1dc"}.fa-headphones:before,.fa4-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before,.fa4-heart:before{content:"\f004"}.fa-heartbeat:before,.fa4-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before,.fa4-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before,.fa4-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before,.fa4-hospital-o:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before,.fa4-hourglass:before{content:"\f254"}.fa-hourglass-end:before,.fa4-hourglass-3:before,.fa4-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before,.fa4-hourglass-2:before,.fa4-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before,.fa4-hourglass-1:before,.fa4-hourglass-start:before{content:"\f251"}.fa-houzz:before,.fa4-houzz:before{content:"\f27c"}.fa-html5:before,.fa4-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before,.fa4-i-cursor:before{content:"\f246"}.fa-id-badge:before,.fa4-id-badge:before{content:"\f2c1"}.fa-id-card:before,.fa4-drivers-license:before,.fa4-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before,.fa4-image:before,.fa4-photo:before,.fa4-picture-o:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before,.fa4-imdb:before{content:"\f2d8"}.fa-inbox:before,.fa4-inbox:before{content:"\f01c"}.fa-indent:before,.fa4-indent:before{content:"\f03c"}.fa-industry:before,.fa4-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before,.fa4-info:before{content:"\f129"}.fa-info-circle:before,.fa4-info-circle:before{content:"\f05a"}.fa-instagram:before,.fa4-instagram:before{content:"\f16d"}.fa-internet-explorer:before,.fa4-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before,.fa4-ioxhost:before{content:"\f208"}.fa-italic:before,.fa4-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before,.fa4-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before,.fa4-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before,.fa4-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before,.fa4-keyboard-o:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before,.fa4-language:before{content:"\f1ab"}.fa-laptop:before,.fa4-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before,.fa4-lastfm:before{content:"\f202"}.fa-lastfm-square:before,.fa4-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before,.fa4-leaf:before{content:"\f06c"}.fa-leanpub:before,.fa4-leanpub:before{content:"\f212"}.fa-lemon:before,.fa4-lemon-o:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before,.fa4-life-bouy:before,.fa4-life-buoy:before,.fa4-life-ring:before,.fa4-life-saver:before,.fa4-support:before{content:"\f1cd"}.fa-lightbulb:before,.fa4-lightbulb-o:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before,.fa4-chain:before,.fa4-link:before{content:"\f0c1"}.fa-linkedin:before,.fa4-linkedin-square:before{content:"\f08c"}.fa-linkedin-in:before,.fa4-linkedin:before{content:"\f0e1"}.fa-linode:before,.fa4-linode:before{content:"\f2b8"}.fa-linux:before,.fa4-linux:before{content:"\f17c"}.fa-lira-sign:before,.fa4-try:before,.fa4-turkish-lira:before{content:"\f195"}.fa-list:before,.fa4-list:before{content:"\f03a"}.fa-list-alt:before,.fa4-list-alt:before{content:"\f022"}.fa-list-ol:before,.fa4-list-ol:before{content:"\f0cb"}.fa-list-ul:before,.fa4-list-ul:before{content:"\f0ca"}.fa-location-arrow:before,.fa4-location-arrow:before{content:"\f124"}.fa-lock:before,.fa4-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before,.fa4-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before,.fa4-magic:before{content:"\f0d0"}.fa-magnet:before,.fa4-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before,.fa4-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before,.fa4-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before,.fa4-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before,.fa4-map-pin:before{content:"\f276"}.fa-map-signs:before,.fa4-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before,.fa4-mars:before{content:"\f222"}.fa-mars-double:before,.fa4-mars-double:before{content:"\f227"}.fa-mars-stroke:before,.fa4-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before,.fa4-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before,.fa4-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before,.fa4-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before,.fa4-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before,.fa4-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before,.fa4-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before,.fa4-meh-o:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before,.fa4-mercury:before{content:"\f223"}.fa-microchip:before,.fa4-microchip:before{content:"\f2db"}.fa-microphone:before,.fa4-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before,.fa4-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before,.fa4-minus:before{content:"\f068"}.fa-minus-circle:before,.fa4-minus-circle:before{content:"\f056"}.fa-minus-square:before,.fa4-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before,.fa4-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before,.fa4-mobile-phone:before,.fa4-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before,.fa4-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before,.fa4-money:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before,.fa4-moon-o:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before,.fa4-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before,.fa4-mouse-pointer:before{content:"\f245"}.fa-music:before,.fa4-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-neuter:before,.fa4-neuter:before{content:"\f22c"}.fa-newspaper:before,.fa4-newspaper-o:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before,.fa4-object-group:before{content:"\f247"}.fa-object-ungroup:before,.fa4-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before,.fa4-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before,.fa4-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before,.fa4-opencart:before{content:"\f23d"}.fa-openid:before,.fa4-openid:before{content:"\f19b"}.fa-opera:before,.fa4-opera:before{content:"\f26a"}.fa-optin-monster:before,.fa4-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before,.fa4-dedent:before,.fa4-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before,.fa4-pagelines:before{content:"\f18c"}.fa-paint-brush:before,.fa4-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before,.fa4-paper-plane:before,.fa4-send:before{content:"\f1d8"}.fa-paperclip:before,.fa4-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before,.fa4-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before,.fa4-clipboard:before,.fa4-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before,.fa4-pause:before{content:"\f04c"}.fa-pause-circle:before,.fa4-pause-circle:before{content:"\f28b"}.fa-paw:before,.fa4-paw:before{content:"\f1b0"}.fa-paypal:before,.fa4-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before,.fa4-pencil-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before,.fa4-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before,.fa4-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before,.fa4-phone-square:before{content:"\f098"}.fa-phone-volume:before,.fa4-volume-control-phone:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before,.fa4-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before,.fa4-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before,.fa4-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before,.fa4-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before,.fa4-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before,.fa4-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before,.fa4-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before,.fa4-play:before{content:"\f04b"}.fa-play-circle:before,.fa4-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before,.fa4-plug:before{content:"\f1e6"}.fa-plus:before,.fa4-plus:before{content:"\f067"}.fa-plus-circle:before,.fa4-plus-circle:before{content:"\f055"}.fa-plus-square:before,.fa4-plus-square:before{content:"\f0fe"}.fa-podcast:before,.fa4-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before,.fa4-gbp:before{content:"\f154"}.fa-power-off:before,.fa4-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before,.fa4-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before,.fa4-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before,.fa4-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before,.fa4-qq:before{content:"\f1d6"}.fa-qrcode:before,.fa4-qrcode:before{content:"\f029"}.fa-question:before,.fa4-question:before{content:"\f128"}.fa-question-circle:before,.fa4-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before,.fa4-quora:before{content:"\f2c4"}.fa-quote-left:before,.fa4-quote-left:before{content:"\f10d"}.fa-quote-right:before,.fa4-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-random:before,.fa4-random:before{content:"\f074"}.fa-ravelry:before,.fa4-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before,.fa4-ra:before,.fa4-rebel:before,.fa4-resistance:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before,.fa4-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before,.fa4-reddit:before{content:"\f1a1"}.fa-reddit-alien:before,.fa4-reddit-alien:before{content:"\f281"}.fa-reddit-square:before,.fa4-reddit-square:before{content:"\f1a2"}.fa-redo:before,.fa4-repeat:before,.fa4-rotate-right:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before,.fa4-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before,.fa4-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before,.fa4-mail-reply-all:before,.fa4-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before,.fa4-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before,.fa4-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before,.fa4-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before,.fa4-feed:before,.fa4-rss:before{content:"\f09e"}.fa-rss-square:before,.fa4-rss-square:before{content:"\f143"}.fa-ruble-sign:before,.fa4-rouble:before,.fa4-rub:before,.fa4-ruble:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before,.fa4-inr:before,.fa4-rupee:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before,.fa4-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before,.fa4-floppy-o:before,.fa4-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before,.fa4-scribd:before{content:"\f28a"}.fa-search:before,.fa4-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before,.fa4-search-minus:before{content:"\f010"}.fa-search-plus:before,.fa4-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before,.fa4-eercast:before{content:"\f2da"}.fa-sellsy:before,.fa4-sellsy:before{content:"\f213"}.fa-server:before,.fa4-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before,.fa4-mail-forward:before,.fa4-share:before{content:"\f064"}.fa-share-alt:before,.fa4-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before,.fa4-share-alt-square:before{content:"\f1e1"}.fa-share-square:before,.fa4-share-square:before{content:"\f14d"}.fa-shekel-sign:before,.fa4-ils:before,.fa4-shekel:before,.fa4-sheqel:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before,.fa4-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before,.fa4-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before,.fa4-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before,.fa4-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before,.fa4-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before,.fa4-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before,.fa4-sign-language:before,.fa4-signing:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before,.fa4-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before,.fa4-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before,.fa4-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before,.fa4-skyatlas:before{content:"\f216"}.fa-skype:before,.fa4-skype:before{content:"\f17e"}.fa-slack:before,.fa4-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before,.fa4-sliders:before{content:"\f1de"}.fa-slideshare:before,.fa4-slideshare:before{content:"\f1e7"}.fa-smile:before,.fa4-smile-o:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before,.fa4-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before,.fa4-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before,.fa4-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before,.fa4-snowflake-o:before{content:"\f2dc"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before,.fa4-sort:before,.fa4-unsorted:before{content:"\f0dc"}.fa-sort-alpha-down:before,.fa4-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-up:before,.fa4-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-down:before,.fa4-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-up:before,.fa4-sort-amount-desc:before{content:"\f161"}.fa-sort-down:before,.fa4-sort-desc:before,.fa4-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before,.fa4-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-up:before,.fa4-sort-numeric-desc:before{content:"\f163"}.fa-sort-up:before,.fa4-sort-asc:before,.fa4-sort-up:before{content:"\f0de"}.fa-soundcloud:before,.fa4-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before,.fa4-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before,.fa4-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before,.fa4-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before,.fa4-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before,.fa4-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before,.fa4-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before,.fa4-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before,.fa4-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before,.fa4-steam:before{content:"\f1b6"}.fa-steam-square:before,.fa4-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before,.fa4-step-backward:before{content:"\f048"}.fa-step-forward:before,.fa4-step-forward:before{content:"\f051"}.fa-stethoscope:before,.fa4-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before,.fa4-sticky-note:before{content:"\f249"}.fa-stop:before,.fa4-stop:before{content:"\f04d"}.fa-stop-circle:before,.fa4-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before,.fa4-street-view:before{content:"\f21d"}.fa-strikethrough:before,.fa4-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before,.fa4-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before,.fa4-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before,.fa4-subscript:before{content:"\f12c"}.fa-subway:before,.fa4-subway:before{content:"\f239"}.fa-suitcase:before,.fa4-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before,.fa4-sun-o:before{content:"\f185"}.fa-superpowers:before,.fa4-superpowers:before{content:"\f2dd"}.fa-superscript:before,.fa4-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before,.fa4-refresh:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before,.fa4-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before,.fa4-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before,.fa4-tag:before{content:"\f02b"}.fa-tags:before,.fa4-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before,.fa4-tasks:before{content:"\f0ae"}.fa-taxi:before,.fa4-cab:before,.fa4-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before,.fa4-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before,.fa4-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before,.fa4-terminal:before{content:"\f120"}.fa-text-height:before,.fa4-text-height:before{content:"\f034"}.fa-text-width:before,.fa4-text-width:before{content:"\f035"}.fa-th:before,.fa4-th:before{content:"\f00a"}.fa-th-large:before,.fa4-th-large:before{content:"\f009"}.fa-th-list:before,.fa4-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before,.fa4-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before,.fa4-thermometer-0:before,.fa4-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before,.fa4-thermometer-4:before,.fa4-thermometer-full:before,.fa4-thermometer:before{content:"\f2c7"}.fa-thermometer-half:before,.fa4-thermometer-2:before,.fa4-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before,.fa4-thermometer-1:before,.fa4-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before,.fa4-thermometer-3:before,.fa4-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before,.fa4-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before,.fa4-thumbs-up:before{content:"\f164"}.fa-thumbtack:before,.fa4-thumb-tack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before,.fa4-close:before,.fa4-remove:before,.fa4-times:before{content:"\f00d"}.fa-times-circle:before,.fa4-times-circle:before{content:"\f057"}.fa-tint:before,.fa4-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before,.fa4-toggle-off:before{content:"\f204"}.fa-toggle-on:before,.fa4-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before,.fa4-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before,.fa4-train:before{content:"\f238"}.fa-transgender:before,.fa4-intersex:before,.fa4-transgender:before{content:"\f224"}.fa-transgender-alt:before,.fa4-transgender-alt:before{content:"\f225"}.fa-trash:before,.fa4-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before,.fa4-tree:before{content:"\f1bb"}.fa-trello:before,.fa4-trello:before{content:"\f181"}.fa-tripadvisor:before,.fa4-tripadvisor:before{content:"\f262"}.fa-trophy:before,.fa4-trophy:before{content:"\f091"}.fa-truck:before,.fa4-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before,.fa4-tty:before{content:"\f1e4"}.fa-tumblr:before,.fa4-tumblr:before{content:"\f173"}.fa-tumblr-square:before,.fa4-tumblr-square:before{content:"\f174"}.fa-tv:before,.fa4-television:before,.fa4-tv:before{content:"\f26c"}.fa-twitch:before,.fa4-twitch:before{content:"\f1e8"}.fa-twitter:before,.fa4-twitter:before{content:"\f099"}.fa-twitter-square:before,.fa4-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before,.fa4-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before,.fa4-underline:before{content:"\f0cd"}.fa-undo:before,.fa4-rotate-left:before,.fa4-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before,.fa4-universal-access:before{content:"\f29a"}.fa-university:before,.fa4-bank:before,.fa4-institution:before,.fa4-university:before{content:"\f19c"}.fa-unlink:before,.fa4-chain-broken:before,.fa4-unlink:before{content:"\f127"}.fa-unlock:before,.fa4-unlock:before{content:"\f09c"}.fa-unlock-alt:before,.fa4-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before,.fa4-upload:before{content:"\f093"}.fa-usb:before,.fa4-usb:before{content:"\f287"}.fa-user:before,.fa4-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before,.fa4-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before,.fa4-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before,.fa4-user-plus:before{content:"\f234"}.fa-user-secret:before,.fa4-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before,.fa4-user-times:before{content:"\f235"}.fa-users:before,.fa4-group:before,.fa4-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before,.fa4-venus:before{content:"\f221"}.fa-venus-double:before,.fa4-venus-double:before{content:"\f226"}.fa-venus-mars:before,.fa4-venus-mars:before{content:"\f228"}.fa-viacoin:before,.fa4-viacoin:before{content:"\f237"}.fa-viadeo:before,.fa4-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before,.fa4-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before,.fa4-video-camera:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before,.fa4-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before,.fa4-vimeo:before{content:"\f27d"}.fa-vine:before,.fa4-vine:before{content:"\f1ca"}.fa-vk:before,.fa4-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before,.fa4-volume-down:before{content:"\f027"}.fa-volume-off:before,.fa4-volume-off:before{content:"\f026"}.fa-volume-up:before,.fa4-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before,.fa4-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before,.fa4-wechat:before,.fa4-weixin:before{content:"\f1d7"}.fa-whatsapp:before,.fa4-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before,.fa4-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before,.fa4-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before,.fa4-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before,.fa4-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before,.fa4-window-minimize:before{content:"\f2d1"}.fa-window-restore:before,.fa4-window-restore:before{content:"\f2d2"}.fa-windows:before,.fa4-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before,.fa4-krw:before,.fa4-won:before{content:"\f159"}.fa-wordpress:before,.fa4-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before,.fa4-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before,.fa4-wpexplorer:before{content:"\f2de"}.fa-wpforms:before,.fa4-wpforms:before{content:"\f298"}.fa-wrench:before,.fa4-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before,.fa4-xing:before{content:"\f168"}.fa-xing-square:before,.fa4-xing-square:before{content:"\f169"}.fa-y-combinator:before,.fa4-y-combinator:before,.fa4-yc:before{content:"\f23b"}.fa-yahoo:before,.fa4-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before,.fa4-yelp:before{content:"\f1e9"}.fa-yen-sign:before,.fa4-cny:before,.fa4-jpy:before,.fa4-rmb:before,.fa4-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before,.fa4-yoast:before{content:"\f2b1"}.fa-youtube:before,.fa4-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/.fa4-envelope-o:before{content:"\f003"}.fa4-star-o:before{content:"\f006"}.fa4-trash-o:before{content:"\f014"}.fa4-file-o:before{content:"\f016"}.fa4-arrow-circle-o-down:before{content:"\f01a"}.fa4-arrow-circle-o-up:before{content:"\f01b"}.fa4-play-circle-o:before{content:"\f01d"}.fa4-pencil:before{content:"\f040"}.fa4-share-square-o:before{content:"\f045"}.fa4-check-square-o:before{content:"\f046"}.fa4-arrows:before{content:"\f047"}.fa4-times-circle-o:before{content:"\f05c"}.fa4-check-circle-o:before{content:"\f05d"}.fa4-arrows-v:before{content:"\f07d"}.fa4-arrows-h:before{content:"\f07e"}.fa4-thumbs-o-up:before{content:"\f087"}.fa4-thumbs-o-down:before{content:"\f088"}.fa4-heart-o:before{content:"\f08a"}.fa4-sign-out:before{content:"\f08b"}.fa4-external-link:before{content:"\f08e"}.fa4-sign-in:before{content:"\f090"}.fa4-square-o:before{content:"\f096"}.fa4-bookmark-o:before{content:"\f097"}.fa4-dashboard:before,.fa4-tachometer:before{content:"\f0e4"}.fa4-comment-o:before{content:"\f0e5"}.fa4-comments-o:before{content:"\f0e6"}.fa4-exchange:before{content:"\f0ec"}.fa4-cloud-download:before{content:"\f0ed"}.fa4-cloud-upload:before{content:"\f0ee"}.fa4-bell-o:before{content:"\f0a2"}.fa4-cutlery:before{content:"\f0f5"}.fa4-file-text-o:before{content:"\f0f6"}.fa4-building-o:before{content:"\f0f7"}.fa4-circle-o:before{content:"\f10c"}.fa4-mail-reply:before,.fa4-reply:before{content:"\f112"}.fa4-folder-o:before{content:"\f114"}.fa4-folder-open-o:before{content:"\f115"}.fa4-flag-o:before{content:"\f11d"}.fa4-star-half-empty:before,.fa4-star-half-full:before,.fa4-star-half-o:before{content:"\f123"}.fa4-shield:before{content:"\f132"}.fa4-ticket:before{content:"\f145"}.fa4-minus-square-o:before{content:"\f147"}.fa4-level-up:before{content:"\f148"}.fa4-level-down:before{content:"\f149"}.fa4-external-link-square:before{content:"\f14c"}.fa4-youtube-square:before{content:"\f166"}.fa4-youtube-play:before{content:"\f16a"}.fa4-bitbucket-square:before{content:"\f172"}.fa4-long-arrow-down:before{content:"\f175"}.fa4-long-arrow-up:before{content:"\f176"}.fa4-long-arrow-left:before{content:"\f177"}.fa4-long-arrow-right:before{content:"\f178"}.fa4-arrow-circle-o-right:before{content:"\f18e"}.fa4-arrow-circle-o-left:before{content:"\f190"}.fa4-plus-square-o:before{content:"\f196"}.fa4-spoon:before{content:"\f1b1"}.fa4-paper-plane-o:before,.fa4-send-o:before{content:"\f1d9"}.fa4-circle-thin:before{content:"\f1db"}.fa4-bell-slash-o:before{content:"\f1f7"}.fa4-meanpath:before{content:"\f20c"}.fa4-diamond:before{content:"\f219"}.fa4-facebook-official:before{content:"\f230"}.fa4-sticky-note-o:before{content:"\f24a"}.fa4-hourglass-o:before{content:"\f250"}.fa4-map-o:before{content:"\f278"}.fa4-commenting-o:before{content:"\f27b"}.fa4-credit-card-alt:before{content:"\f283"}.fa4-pause-circle-o:before{content:"\f28c"}.fa4-stop-circle-o:before{content:"\f28e"}.fa4-wheelchair-alt:before{content:"\f29b"}.fa4-question-circle-o:before{content:"\f29c"}.fa4-envelope-open-o:before{content:"\f2b7"}.fa4-address-book-o:before{content:"\f2ba"}.fa4-address-card-o:before,.fa4-vcard-o:before{content:"\f2bc"}.fa4-user-circle-o:before{content:"\f2be"}.fa4-user-o:before{content:"\f2c0"}.fa4-drivers-license-o:before,.fa4-id-card-o:before{content:"\f2c3"}.fa4-times-rectangle:before,.fa4-window-close:before{content:"\f2d3"}.fa4-times-rectangle-o:before,.fa4-window-close-o:before{content:"\f2d4"}.charts-icon-geoglobe:before{content:"\0041"}.mms-icon-addcenter{color:#13aa52;color:var(--mms-green2)}.mms-icon-configsvr-down,.mms-icon-configsvr-fatal,.mms-icon-configsvr-shunned,.mms-icon-configsvr-unknown,.mms-icon-deadface,.mms-icon-down,.mms-icon-fatal,.mms-icon-shunned,.mms-icon-unknown{color:#ef4c4c;color:var(--mms-alert-red)}.mms-icon-configsvr-recovering,.mms-icon-configsvr-rollback,.mms-icon-configsvr-startup,.mms-icon-configsvr-startup2,.mms-icon-recovering,.mms-icon-rollback,.mms-icon-startup,.mms-icon-startup2,.mms-icon-surprisedface{color:#ffb618;color:var(--mms-warning-text)}.mms-icon-configsvr-arbiter:after,.mms-icon-configsvr-delayed:after,.mms-icon-configsvr-down:after,.mms-icon-configsvr-fatal:after,.mms-icon-configsvr-hidden:after,.mms-icon-configsvr-nostate:after,.mms-icon-configsvr-primary:after,.mms-icon-configsvr-recovering:after,.mms-icon-configsvr-rollback:after,.mms-icon-configsvr-secondary:after,.mms-icon-configsvr-shunned:after,.mms-icon-configsvr-startup2:after,.mms-icon-configsvr-startup:after,.mms-icon-configsvr-unknown:after,.mms-icon-replica-set-configsvr:after{content:"\E084"}.mms-icon-wrench-exclamation{color:#babdbe;color:var(--mms-gray5)}.mms-icon-replica-set-configsvr{content:"\E144"}.mms-org-icon-activity-feed:before{content:"\0049"}.mms-icon-nostate:before{content:"\E000"}.mms-icon-startup2:before,.mms-icon-startup:before{content:"\E001"}.mms-icon-primary:before{content:"\E004"}.mms-icon-secondary:before{content:"\E005"}.mms-icon-arbiter:before{content:"\E007"}.mms-icon-hidden-s:before{content:"\E009"}.mms-icon-delayed:before{content:"\E011"}.mms-icon-recovering:before{content:"\E013"}.mms-icon-down:before{content:"\E015"}.mms-icon-fatal:before{content:"\E017"}.mms-icon-shunned:before{content:"\E019"}.mms-icon-rollback:before{content:"\E021"}.mms-icon-unknown:before{content:"\E023"}.mms-icon-standalone:before{content:"\E030"}.mms-icon-replica-set:before{content:"\E031"}.mms-icon-replica-set-configsvr:before{content:"\E143"}.mms-icon-cluster:before{content:"\E032"}.mms-icon-mongos:before{content:"\E033"}.mms-icon-configsvr:before{content:"\E034"}.mms-icon-configsvr-down:before{content:"\E045"}.mms-icon-configsvr-shunned:before{content:"\E048"}.mms-icon-configsvr-hidden:before{content:"\E051"}.mms-icon-configsvr-recovering:before{content:"\E054"}.mms-icon-configsvr-delayed:before{content:"\E057"}.mms-icon-configsvr-arbiter:before{content:"\E060"}.mms-icon-configsvr-nostate:before{content:"\E038"}.mms-icon-configsvr-primary:before{content:"\E040"}.mms-icon-configsvr-startup2:before,.mms-icon-configsvr-startup:before{content:"\E063"}.mms-icon-configsvr-secondary:before{content:"\E042"}.mms-icon-configsvr-rollback:before{content:"\E066"}.mms-icon-configsvr-fatal:before{content:"\E069"}.mms-icon-configsvr-unknown:before{content:"\E072"}.mms-icon-addcenter:before{content:"\E083"}.mms-icon-dragtopleft:before{content:"\E200"}.mms-icon-bell:before{content:"\E201"}.mms-icon-list:before{content:"\E202"}.mms-icon-topology:before{content:"\E203"}.mms-icon-cloud:before{content:"\E204"}.mms-icon-lock:before{content:"\E205"}.mms-icon-laptop:before{content:"\E206"}.mms-icon-office:before{content:"\E207"}.mms-icon-floppy:before{content:"\E208"}.mms-icon-support1:before{content:"\E209"}.mms-icon-support2:before{content:"\E210"}.mms-icon-add:before{content:"\E211"}.mms-icon-remove:before{content:"\E212"}.mms-icon-check:before{content:"\E213"}.mms-icon-creditcard:before{content:"\E214"}.mms-icon-graph:before{content:"\E215"}.mms-icon-api:before{content:"\E216"}.mms-icon-2fa:before{content:"\E217"}.mms-icon-smartphone:before{content:"\E218"}.mms-icon-continuous:before{content:"\E219"}.mms-icon-pointintime:before{content:"\E220"}.mms-icon-hammer:before{content:"\E221"}.mms-icon-edit:before{content:"\E222"}.mms-icon-umbrella:before{content:"\E223"}.mms-icon-ellipsis:before{content:"\E224"}.mms-icon-dragleft:before{content:"\E225"}.mms-icon-list-skinny:before{content:"\E226"}.mms-icon-modify:before,.mms-icon-wrench:before{content:"\E227"}.mms-icon-grid:before{content:"\E228"}.mms-icon-ssl:before{content:"\E229"}.mms-icon-auth:before{content:"\E230"}.mms-icon-metrics:before{content:"\E232"}.mms-icon-back:before{content:"\E233"}.mms-icon-surprisedface:before{content:"\E234"}.mms-icon-sadface:before{content:"\E235"}.mms-icon-deadface:before{content:"\E236"}.mms-icon-paused:before{content:"\E239"}.mms-icon-automation:before{content:"\E300"}.mms-icon-backup:before{content:"\E301"}.mms-icon-monitoring:before{content:"\E302"}.mms-icon-group:before{content:"\E303"}.mms-icon-user:before{content:"\E304"}.mms-icon-role:before{content:"\E305"}.mms-icon-leaf:before{content:"\E306"}.mms-icon-databases:before{content:"\E307"}.mms-icon-database:before{content:"\E308"}.mms-icon-servers:before{content:"\E309"}.mms-icon-server:before{content:"\E310"}.mms-icon-dashboard:before{content:"\E311"}.mms-icon-setup:before{content:"\E312"}.mms-icon-settings:before{content:"\E313"}.mms-icon-activity:before{content:"\E314"}.mms-icon-ops-manager:before{content:"\E315"}.mms-icon-logo-amazon:before{content:"\E500"}.mms-icon-logo-ubuntu:before{content:"\E501"}.mms-icon-logo-apple:before{content:"\E502"}.mms-icon-logo-linux:before{content:"\E503"}.mms-icon-logo-windows:before{content:"\E504"}.mms-icon-logo-redhat:before{content:"\E505"}.mms-icon-rocketbot:before{content:"\F006"}.mms-icon-snowbot:before{content:"\F007"}.mms-icon-medium-cloud:before{content:"\F010"}.mms-icon-sadface{color:color(var(--alert-red) tint(25%));color:var(--mms-alert-red-dark)}body{--font-color-primary:var(--black);--font-color-light:var(--gray-base);--heading-color-primary:var(--green-dark2);--opposite-color:var(--black);--font-color-active:var(--green-dark2);--link-color-primary:var(--blue-base);--link-font-weight:500;--background-color-primary:var(--white);--background-color-secondary:var(--gray-light3);--sidenav-bg-color:var(--gray-light3);--sidenav-border-bottom-color:var(--gray-light2);--sidenav-toggle-color:var(--green-dark2);--sidenav-toggle-border-color:var(--gray-light2);--sidenav-item-title:var(--gray-dark3);--sidenav-item-color:var(--black);--sidenav-hover-bg-color:var(--gray-light2);--sidenav-active-bg-color:var(--green-light3);--sidenav-active-color:var(--green-dark2);--sidenav-active-before-color:var(--green-dark1);--select-button-bg-color:var(--white);--select-button-color:var(--black);--select-button-carot:var(--gray-dark2);--tab-color-primary:var(--gray-dark1);--tab-color-secondary:var(--green-dark2);--wayfinding-bg-color:var(--gray-light3);--wayfinding-border-color:var(--gray-light2)}.dark-theme body{--font-color-primary:var(--gray-light2);--font-color-light:var(--gray-light2);--heading-color-primary:var(--gray-light2);--opposite-color:var(--white);--font-color-active:var(--green-light1);--link-color-primary:var(--blue-light1);--link-font-weight:700;--background-color-primary:var(--black);--background-color-secondary:transparent;--sidenav-bg-color:var(--gray-dark4);--sidenav-border-bottom-color:var(--gray-dark2);--sidenav-toggle-color:var(--gray-light1);--sidenav-toggle-border-color:var(--gray-dark2);--sidenav-item-title:var(--gray-light2);--sidenav-item-color:var(--gray-light2);--sidenav-hover-bg-color:var(--gray-dark3);--sidenav-active-bg-color:var(--green-dark3);--sidenav-active-color:var(--white);--sidenav-active-before-color:var(--green-base);--select-button-bg-color:var(--gray-dark4);--select-button-color:var(--gray-light3);--select-button-carot:var(--gray-light1);--tab-color-primary:var(--gray-light1);--tab-color-secondary:var(--gray-light2);--wayfinding-bg-color:var(--gray-dark3);--wayfinding-border-color:var(--gray-dark2);::-webkit-scrollbar{background:var(--gray-dark3)}::-webkit-scrollbar-thumb{background:var(--gray-dark2);background-clip:content-box;border:3px solid transparent;border-radius:9px}}body{background-color:var(--background-color-primary);color:var(--font-color-primary)}.nav-dark{display:none}.dark-theme .nav-dark,.nav-light{display:initial}.dark-theme .nav-light{display:none}
Perform One-to-One Joins - Database Manual - MongoDB Docs Download Try Community Edition
Explore the latest version of MongoDB
Startups and AI Innovators
For world-changing ideas and AI pioneers
Contact Us
Reach out to MongoDB
This tutorial illustrates how to construct an aggregation pipeline,
perform the aggregation on a collection, and display the results using
the language of your choice.
This tutorial demonstrates how to combine data from a collection that
describes product information with another collection that describes
customer orders. The results show a list of all orders placed in 2020
and includes the product details associated with each order.
This aggregation performs a one-to-one join. A one-to-one join occurs
when a document in one collection has a field value that matches a
single document in another collection that has the same field value. The
aggregation matches these documents on the field value and combines
information from both sources into one result.
Note A one-to-one join does not require the documents to have a one-to-one
relationship. To learn more about this data relationship,
see the Wikipedia entry about One-to-one (data model).
➤ Use the Select your language drop-down menu in the
upper-right to set the language of the following examples or select
MongoDB Shell.
MongoDB Shell
C
C++11
C#
Go
Java (Sync)
Kotlin (Coroutine)
Node.js
PHP
Python
Ruby
Rust
Scala
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections, use the
insertMany() method:
db.orders .insertMany ( [ { customer_id : "[email protected] " , orderdate : new Date ("2020-05-30T08:35:52Z" ), product_id : "a1b2c3d4" , value : 431.43 }, { customer_id : "[email protected] " , orderdate : new Date ("2019-05-28T19:13:32Z" ), product_id : "z9y8x7w6" , value : 5.01 }, { customer_id : "[email protected] " , orderdate : new Date ("2020-01-01T08:25:37Z" ), product_id : "ff11gg22hh33" , value : 63.13 }, { customer_id : "[email protected] " , orderdate : new Date ("2020-12-26T08:55:46Z" ), product_id : "a1b2c3d4" , value : 429.65 } ] )
db.products .insertMany ( [ { p_id : "a1b2c3d4" , name : "Asus Laptop" , category : "ELECTRONICS" , description : "Good value laptop for students" }, { p_id : "z9y8x7w6" , name : "The Day Of The Triffids" , category : "BOOKS" , description : "Classic post-apocalyptic novel" }, { p_id : "ff11gg22hh33" , name : "Morphy Richardds Food Mixer" , category : "KITCHENWARE" , description : "Luxury mixer turning good cakes into great" }, { p_id : "pqr678st" , name : "Karcher Hose Set" , category : "GARDEN" , description : "Hose + nozzles + winder for tidy storage" } ] )
Before you begin following this aggregation tutorial, you must set up a
new C app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
agg-tutorial.c. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
# include <stdio.h> # include <bson/bson.h> # include <mongoc/mongoc.h>
int main ( void ) { mongoc_init();
char *uri = "<connection string>" ; mongoc_client_t * client = mongoc_client_new(uri);
{ const bson_t *doc;
bson_t *pipeline = BCON_NEW("pipeline" , "[" , "]" );
bson_destroy(pipeline);
while (mongoc_cursor_next(results, &doc)) { char *str = bson_as_canonical_extended_json(doc, NULL ); printf ("%s \n " , str); bson_free(str); } bson_error_t error; if (mongoc_cursor_error(results, &error)) { fprintf (stderr , "Aggregation error: %s \n " , error.message); }
mongoc_cursor_destroy(results); }
mongoc_client_destroy(client); mongoc_cleanup();
return EXIT_SUCCESS; }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
char *uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
mongoc_collection_t *orders = mongoc_client_get_collection(client, "agg_tutorials_db" , "orders" );mongoc_collection_t *products = mongoc_client_get_collection(client, "agg_tutorials_db" , "products" );
{ bson_t *filter = bson_new(); bson_error_t error; if (!mongoc_collection_delete_many(orders, filter, NULL , NULL , &error)) { fprintf (stderr , "Delete error: %s \n " , error.message); } if (!mongoc_collection_delete_many(products, filter, NULL , NULL , &error)) { fprintf (stderr , "Delete error: %s \n " , error.message); } bson_destroy(filter); }
{ size_t num_docs = 4 ; bson_t *order_docs[num_docs];
order_docs[0 ] = BCON_NEW( "customer_id" , BCON_UTF8("[email protected] " ), "orderdate" , BCON_DATE_TIME(1590822952000UL ), "product_id" , BCON_UTF8("a1b2c3d4" ), "value" , BCON_DOUBLE(431.43 ));
order_docs[1 ] = BCON_NEW( "customer_id" , BCON_UTF8("[email protected] " ), "orderdate" , BCON_DATE_TIME(1559063612000UL ), "product_id" , BCON_UTF8("z9y8x7w6" ), "value" , BCON_DOUBLE(5.01 ));
order_docs[2 ] = BCON_NEW( "customer_id" , BCON_UTF8("[email protected] " ), "orderdate" , BCON_DATE_TIME(1577869537000UL ), "product_id" , BCON_UTF8("ff11gg22hh33" ), "value" , BCON_DOUBLE(63.13 ));
order_docs[3 ] = BCON_NEW( "customer_id" , BCON_UTF8("[email protected] " ), "orderdate" , BCON_DATE_TIME(1608976546000UL ), "product_id" , BCON_UTF8("a1b2c3d4" ), "value" , BCON_DOUBLE(429.65 ));
bson_error_t error; if (!mongoc_collection_insert_many(orders, (const bson_t **)order_docs, num_docs, NULL , NULL , &error)) { fprintf (stderr , "Insert error: %s \n " , error.message); }
for (int i = 0 ; i < num_docs; i++) { bson_destroy(order_docs[i]); } }
{ size_t num_docs = 4 ; bson_t *product_docs[num_docs];
product_docs[0 ] = BCON_NEW( "id" , BCON_UTF8("a1b2c3d4" ), "name" , BCON_UTF8("Asus Laptop" ), "category" , BCON_UTF8("ELECTRONICS" ), "description" , BCON_UTF8("Good value laptop for students" ));
product_docs[1 ] = BCON_NEW( "id" , BCON_UTF8("z9y8x7w6" ), "name" , BCON_UTF8("The Day Of The Triffids" ), "category" , BCON_UTF8("BOOKS" ), "description" , BCON_UTF8("Classic post-apocalyptic novel" ));
product_docs[2 ] = BCON_NEW( "id" , BCON_UTF8("ff11gg22hh33" ), "name" , BCON_UTF8("Morphy Richardds Food Mixer" ), "category" , BCON_UTF8("KITCHENWARE" ), "description" , BCON_UTF8("Luxury mixer turning good cakes into great" ));
product_docs[3 ] = BCON_NEW( "id" , BCON_UTF8("pqr678st" ), "name" , BCON_UTF8("Karcher Hose Set" ), "category" , BCON_UTF8("GARDEN" ), "description" , BCON_UTF8("Hose + nozzles + winder for tidy storage" ));
bson_error_t error; if (!mongoc_collection_insert_many(products, (const bson_t **)product_docs, num_docs, NULL , NULL , &error)) { fprintf (stderr , "Insert error: %s \n " , error.message); }
for (int i = 0 ; i < num_docs; i++) { bson_destroy(product_docs[i]); } }
Before you begin following an aggregation tutorial, you must set up a
new C++ app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
agg-tutorial.cpp. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
# include <iostream> # include <bsoncxx/builder/basic/document.hpp> # include <bsoncxx/builder/basic/kvp.hpp> # include <bsoncxx/json.hpp> # include <mongocxx/client.hpp> # include <mongocxx/instance.hpp> # include <mongocxx/pipeline.hpp> # include <mongocxx/uri.hpp> # include <chrono>
using bsoncxx::builder::basic::kvp;using bsoncxx::builder::basic::make_document;using bsoncxx::builder::basic::make_array;
int main () { mongocxx::instance instance;
mongocxx :: uri uri ( "<connection string>" ) ; mongocxx :: client client (uri) ;
auto db = client["agg_tutorials_db" ]; db.drop ();
mongocxx::pipeline pipeline;
auto cursor = orders.aggregate (pipeline); for (auto && doc : cursor) { std::cout << bsoncxx::to_json (doc, bsoncxx::ExtendedJsonMode::k_relaxed) << std::endl; } }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the C++ Get Started tutorial.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
mongocxx::uri uri{"mongodb+srv://mongodb-example:27017" };
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
auto orders = db["orders" ];auto products = db["products" ];
std::vector<bsoncxx::document::value> order_docs = { bsoncxx::from_json (R"({ "customer_id": "[email protected] ", "orderdate": {"$date": 1590821752000}, "product_id": "a1b2c3d4", "value": 431.43 })" ), bsoncxx::from_json (R"({ "customer_id": "[email protected] ", "orderdate": {"$date": 1559062412}, "product_id": "z9y8x7w6", "value": 5.01 })" ), bsoncxx::from_json (R"({ "customer_id": "[email protected] ", "orderdate": {"$date": 1577861137}, "product_id": "ff11gg22hh33", "value": 63.13 })" ), bsoncxx::from_json (R"({ "customer_id": "[email protected] ", "orderdate": {"$date": 1608972946000}, "product_id": "a1b2c3d4", "value": 429.65 })" )};
orders.insert_many (order_docs);
std::vector<bsoncxx::document::value> product_docs = { bsoncxx::from_json (R"({ "id": "a1b2c3d4", "name": "Asus Laptop", "category": "ELECTRONICS", "description": "Good value laptop for students" })" ), bsoncxx::from_json (R"({ "id": "z9y8x7w6", "name": "The Day Of The Triffids", "category": "BOOKS", "description": "Classic post-apocalyptic novel" })" ), bsoncxx::from_json (R"({ "id": "ff11gg22hh33", "name": "Morphy Richardds Food Mixer", "category": "KITCHENWARE", "description": "Luxury mixer turning good cakes into great" })" ), bsoncxx::from_json (R"({ "id": "pqr678st", "name": "Karcher Hose Set", "category": "GARDEN", "description": "Hose + nozzles + winder for tidy storage" })" )};
products.insert_many (product_docs);
Before you begin following this aggregation tutorial, you must set up a
new C#/.NET app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, paste the following code into your
Program.cs file to create an app template for the aggregation
tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
using MongoDB.Bson;using MongoDB.Bson.Serialization.Attributes;using MongoDB.Driver;
var uri = "<connection string>" ;var client = new MongoClient(uri);var aggDB = client.GetDatabase("agg_tutorials_db" );
foreach (var result in results.ToList()){ Console.WriteLine(result); }
For every tutorial, you must replace the connection string placeholder
with your deployment's connection string.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
var uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order must contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the ProductId field
that exists in documents in both collections.
First, create C# classes to model the data in the orders and products
collections:
public class Order { [BsonId ] public ObjectId Id { get ; set ; }
public required string CustomerId { get ; set ; } public DateTime OrderDate { get ; set ; } public required string ProductId { get ; set ; } public double Value { get ; set ; } }
public class Product { [BsonId ] public required string Id { get ; set ; }
public string Name { get ; set ; } = "" ; public string Category { get ; set ; } = "" ; public string Description { get ; set ; } = "" ; }
To create the orders and products collections and insert the
sample data, add the following code to your application:
var orders = aggDB.GetCollection<Order>("orders" );var products = aggDB.GetCollection<Product>("products" );
orders = aggDB.GetCollection<Order>("orders" ); products = aggDB.GetCollection<Product>("products" );
orders.InsertMany(new List<Order> { new Order() { CustomerId = "[email protected] " , OrderDate = DateTime.Parse("2020-05-30T08:35:52Z" ), ProductId = "a1b2c3d4" , Value = 431.43 }, new Order() { CustomerId = "[email protected] " , OrderDate = DateTime.Parse("2019-05-28T19:13:32Z" ), ProductId = "z9y8x7w6" , Value = 5.01 }, new Order() { CustomerId = "[email protected] " , OrderDate = DateTime.Parse("2020-01-01T08:25:37Z" ), ProductId = "ff11gg22hh33" , Value = 63.13 }, new Order() { CustomerId = "[email protected] " , OrderDate = DateTime.Parse("2020-12-26T08:55:46Z" ), ProductId = "a1b2c3d4" , Value = 429.65 } });
products.InsertMany(new List<Product> { new Product() { Id = "a1b2c3d4" , Name = "Asus Laptop" , Category = "ELECTRONICS" , Description = "Good value laptop for students" }, new Product() { Id = "z9y8x7w6" , Name = "The Day Of The Triffids" , Category = "BOOKS" , Description = "Classic post-apocalyptic novel" }, new Product() { Id = "ff11gg22hh33" , Name = "Morphy Richardds Food Mixer" , Category = "KITCHENWARE" , Description = "Luxury mixer turning good cakes into great" }, new Product() { Id = "pqr678st" , Name = "Karcher Hose Set" , Category = "GARDEN" , Description = "Hose + nozzles + winder for tidy storage" } });
Before you begin following this aggregation tutorial, you must set up a
new Go app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
agg_tutorial.go. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
const uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
First, create Go structs to model the data in the orders and products
collections:
type Order struct { CustomerID string `bson:"customer_id"` OrderDate bson.DateTime `bson:"orderdate"` ProductID string `bson:"product_id"` Value float32 `bson:"value"` }
type Product struct { ID string `bson:"id"` Name string `bson:"name"` Category string `bson:"category"` Description string `bson:"description"` }
To create the orders and products collections and insert the
sample data, add the following code to your application:
orders := aggDB.Collection("orders" ) products := aggDB.Collection("products" )
_, err = orders.InsertMany(ctx, []interface {}{ Order{ CustomerID: "[email protected] " , OrderDate: bson.NewDateTimeFromTime(time.Date(2020 , 5 , 30 , 8 , 35 , 52 , 0 , time.UTC)), ProductID: "a1b2c3d4" , Value: 431.43 , }, Order{ CustomerID: "[email protected] " , OrderDate: bson.NewDateTimeFromTime(time.Date(2019 , 5 , 28 , 19 , 13 , 32 , 0 , time.UTC)), ProductID: "z9y8x7w6" , Value: 5.01 , }, Order{ CustomerID: "[email protected] " , OrderDate: bson.NewDateTimeFromTime(time.Date(2020 , 01 , 8 , 25 , 37 , 0 , time.UTC)), ProductID: "ff11gg22hh33" , Value: 63.13 , }, Order{ CustomerID: "[email protected] " , OrderDate: bson.NewDateTimeFromTime(time.Date(2020 , 12 , 26 , 8 , 55 , 46 , 0 , time.UTC)), ProductID: "a1b2c3d4" , Value: 429.65 , }, }) if err != nil {
log.Fatal(err) }
_, err = products.InsertMany(ctx, []interface {}{ Product{ ID: "a1b2c3d4" , Name: "Asus Laptop" , Category: "ELECTRONICS" , Description: "Good value laptop for students" , }, Product{ ID: "z9y8x7w6" , Name: "The Day Of The Triffids" , Category: "BOOKS" , Description: "Classic post-apocalyptic novel" , }, Product{ ID: "ff11gg22hh33" , Name: "Morphy Richardds Food Mixer" , Category: "KITCHENWARE" , Description: "Luxury mixer turning good cakes into great" , }, Product{ ID: "pqr678st" , Name: "Karcher Hose Set" , Category: "GARDEN" , Description: "Hose + nozzles + winder for tidy storage" , }, }) if err != nil { log.Fatal(err) }
Before you begin following an aggregation tutorial, you must set up a
new Java app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
AggTutorial.java. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
package org.example;
import com.mongodb.client.*;import com.mongodb.client.model.Accumulators;import com.mongodb.client.model.Aggregates;import com.mongodb.client.model.Field;import com.mongodb.client.model.Filters;import com.mongodb.client.model.Sorts;import com.mongodb.client.model.Variable;import org.bson.Document;import org.bson.conversions.Bson;
import java.time.LocalDateTime;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;
public class AggTutorial { public static void main (String[] args) { String uri = "<connection string>" ;
try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db" );
List<Bson> pipeline = new ArrayList <>();
for (Document document : aggregationResult) { System.out.println(document.toJson()); } } } }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Java Sync Quick Start guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
String uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
MongoDatabase aggDB = mongoClient.getDatabase("agg_tutorials_db" );MongoCollection<Document> orders = aggDB.getCollection("orders" ); MongoCollection<Document> products = aggDB.getCollection("products" );
orders.insertMany( Arrays.asList( new Document ("customer_id" , "[email protected] " ) .append("orderdate" , LocalDateTime.parse("2020-05-30T08:35:52" )) .append("product_id" , "a1b2c3d4" ) .append("value" , 431.43 ), new Document ("customer_id" , "[email protected] " ) .append("orderdate" , LocalDateTime.parse("2019-05-28T19:13:32" )) .append("product_id" , "z9y8x7w6" ) .append("value" , 5.01 ), new Document ("customer_id" , "[email protected] " ) .append("orderdate" , LocalDateTime.parse("2020-01-01T08:25:37" )) .append("product_id" , "ff11gg22hh33" ) .append("value" , 63.13 ), new Document ("customer_id" , "[email protected] " ) .append("orderdate" , LocalDateTime.parse("2020-12-26T08:55:46" )) .append("product_id" , "a1b2c3d4" ) .append("value" , 429.65 ) ) );
products.insertMany( Arrays.asList( new Document ("id" , "a1b2c3d4" ) .append("name" , "Asus Laptop" ) .append("category" , "ELECTRONICS" ) .append("description" , "Good value laptop for students" ), new Document ("id" , "z9y8x7w6" ) .append("name" , "The Day Of The Triffids" ) .append("category" , "BOOKS" ) .append("description" , "Classic post-apocalyptic novel" ), new Document ("id" , "ff11gg22hh33" ) .append("name" , "Morphy Richardds Food Mixer" ) .append("category" , "KITCHENWARE" ) .append("description" , "Luxury mixer turning good cakes into great" ), new Document ("id" , "pqr678st" ) .append("name" , "Karcher Hose Set" ) .append("category" , "GARDEN" ) .append("description" , "Hose + nozzles + winder for tidy storage" ) ) );
Before you begin following an aggregation tutorial, you must set up a
new Kotlin app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
In addition to the driver, you must also add the following dependencies
to your build.gradle.kts file and reload your project:
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1" ) implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1" ) }
After you install the driver, create a file called
AggTutorial.kt. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
package org.example
import com.mongodb.client.model.*import com.mongodb.kotlin.client.coroutine.MongoClientimport kotlinx.coroutines.runBlockingimport kotlinx.datetime.LocalDateTimeimport kotlinx.datetime.toJavaLocalDateTimeimport kotlinx.serialization.Contextualimport kotlinx.serialization.Serializableimport org.bson.Documentimport org.bson.conversions.Bson
@Serializable data class MyClass ( ... )
suspend fun main () { val uri = "<connection string>"
MongoClient.create(uri).use { mongoClient -> val aggDB = mongoClient.getDatabase("agg_tutorials_db" )
val pipeline = mutableListOf<Bson>()
aggregationResult.collect { println(it) } } }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Connect to your Cluster
step of the Kotlin Driver Quick Start guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
val uri = "mongodb+srv://mongodb-example:27017"
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
First, create Kotlin data classes to model the data in the orders and products
collections:
@Serializable data class Order ( val customerID: String, @Contextual val orderDate: LocalDateTime, val productID: String, val value: Double )
@Serializable data class Product ( val ID: String, val name: String, val category: String, val description: String )
To create the orders and products collections and insert the
sample data, add the following code to your application:
val orders = aggDB.getCollection<Order>("orders" )val products = aggDB.getCollection<Product>("products" )
orders.deleteMany(Filters.empty()); products.deleteMany(Filters.empty());
orders.insertMany( listOf( Order("[email protected] " , LocalDateTime.parse("2020-05-30T08:35:52" ), "a1b2c3d4" , 431.43 ), Order("[email protected] " , LocalDateTime.parse("2019-05-28T19:13:32" ), "z9y8x7w6" , 5.01 ), Order("[email protected] " , LocalDateTime.parse("2020-01-01T08:25:37" ), "ff11gg22hh33" , 63.13 ), Order("[email protected] " , LocalDateTime.parse("2020-12-26T08:55:46" ), "a1b2c3d4" , 429.65 ) ) )
products.insertMany( listOf( Product("a1b2c3d4" , "Asus Laptop" , "ELECTRONICS" , "Good value laptop for students" ), Product("z9y8x7w6" , "The Day Of The Triffids" , "BOOKS" , "Classic post-apocalyptic novel" ), Product( "ff11gg22hh33" , "Morphy Richardds Food Mixer" , "KITCHENWARE" , "Luxury mixer turning good cakes into great" ), Product("pqr678st" , "Karcher Hose Set" , "GARDEN" , "Hose + nozzles + winder for tidy storage" ) ) )
Before you begin following this aggregation tutorial, you must set up a
new Node.js app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file to run the tutorial template. Paste
the following code in this file to create an app template for the aggregation
tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
const { MongoClient } = require ('mongodb' );const uri = '<connection-string>' ;const client = new MongoClient (uri);export async function run () { try { const aggDB = client.db ('agg_tutorials_db' );
const pipeline = [];
for await (const document of aggregationResult) { console .log (document ); } } finally { await client.close (); } }
run ().catch (console .dir );
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Node.js Quick Start guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
const uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
const orders = aggDB.collection ('orders' );const products = aggDB.collection ('products' );
await orders.insertMany ([ { customer_id : '[email protected] ' , orderdate : new Date ('2020-05-30T08:35:52Z' ), product_id : 'a1b2c3d4' , value : 431.43 , }, { customer_id : '[email protected] ' , orderdate : new Date ('2019-05-28T19:13:32Z' ), product_id : 'z9y8x7w6' , value : 5.01 , }, { customer_id : '[email protected] ' , orderdate : new Date ('2020-01-01T08:25:37Z' ), product_id : 'ff11gg22hh33' , value : 63.13 , }, { customer_id : '[email protected] ' , orderdate : new Date ('2020-12-26T08:55:46Z' ), product_id : 'a1b2c3d4' , value : 429.65 , }, ]);
await products.insertMany ([ { id : 'a1b2c3d4' , name : 'Asus Laptop' , category : 'ELECTRONICS' , description : 'Good value laptop for students' , }, { id : 'z9y8x7w6' , name : 'The Day Of The Triffids' , category : 'BOOKS' , description : 'Classic post-apocalyptic novel' , }, { id : 'ff11gg22hh33' , name : 'Morphy Richardds Food Mixer' , category : 'KITCHENWARE' , description : 'Luxury mixer turning good cakes into great' , }, { id : 'pqr678st' , name : 'Karcher Hose Set' , category : 'GARDEN' , description : 'Hose + nozzles + winder for tidy storage' , }, ]);
Before you begin following this aggregation tutorial, you must set up a
new PHP app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the library, create a file called
agg_tutorial.php. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
<?php
require 'vendor/autoload.php' ;
use MongoDB \Client ;use MongoDB \BSON \UTCDateTime ;use MongoDB \Builder \Pipeline ;use MongoDB \Builder \Stage ;use MongoDB \Builder \Type \Sort ;use MongoDB \Builder \Query ;use MongoDB \Builder \Expression ;use MongoDB \Builder \Accumulator ;
use function MongoDB \object ;
$uri = '<connection string>' ;$client = new Client ($uri );
foreach ($cursor as $doc ) { echo json_encode ($doc , JSON_PRETTY_PRINT), PHP_EOL; }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Get Started with the PHP Library tutorial.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
$uri = 'mongodb+srv://mongodb-example:27017' ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
$orders = $client ->agg_tutorials_db->orders;$products = $client ->agg_tutorials_db->products;
$orders ->deleteMany ([]);$products ->deleteMany ([]);
$orders ->insertMany ( [ [ 'customer_id' => '[email protected] ' , 'orderdate' => new UTCDateTime (new DateTimeImmutable ('2020-05-30T08:35:52' )), 'product_id' => 'a1b2c3d4' , 'value' => 431.43 ], [ 'customer_id' => '[email protected] ' , 'orderdate' => new UTCDateTime (new DateTimeImmutable ('2019-05-28T19:13:32' )), 'product_id' => 'z9y8x7w6' , 'value' => 5.01 ], [ 'customer_id' => '[email protected] ' , 'orderdate' => new UTCDateTime (new DateTimeImmutable ('2020-01-01T08:25:37' )), 'product_id' => 'ff11gg22hh33' , 'value' => 63.13 , ], [ 'customer_id' => '[email protected] ' , 'orderdate' => new UTCDateTime (new DateTimeImmutable ('2020-12-26T08:55:46' )), 'product_id' => 'a1b2c3d4' , 'value' => 429.65 ], ] );
$products ->insertMany ( [ [ 'id' => 'a1b2c3d4' , 'name' => 'Asus Laptop' , 'category' => 'ELECTRONICS' , 'description' => 'Good value laptop for students' , ], [ 'id' => 'z9y8x7w6' , 'name' => 'The Day Of The Triffids' , 'category' => 'BOOKS' , 'description' => 'Classic post-apocalyptic novel' , ], [ 'id' => 'ff11gg22hh33' , 'name' => 'Morphy Richardds Food Mixer' , 'category' => 'KITCHENWARE' , 'description' => 'Luxury mixer turning good cakes into great' , ], [ 'id' => 'pqr678st' , 'name' => 'Karcher Hose Set' , 'category' => 'GARDEN' , 'description' => 'Hose + nozzles + winder for tidy storage' , ], ] );
Before you begin following this aggregation tutorial, you must set up a
new Python app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the library, create a file called
agg_tutorial.py. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
from pymongo import MongoClient
uri = "<connection-string>" client = MongoClient(uri)
try : agg_db = client["agg_tutorials_db" ]
pipeline = []
for document in aggregation_result: print (document)
finally : client.close()
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Get Started with the PHP Library tutorial.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
uri = "mongodb+srv://mongodb-example:27017"
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
orders_coll = agg_db["orders" ] products_coll = agg_db["products" ]
order_data = [ { "customer_id" : "[email protected] " , "orderdate" : datetime(2020 , 5 , 30 , 8 , 35 , 52 ), "product_id" : "a1b2c3d4" , "value" : 431.43 , }, { "customer_id" : "[email protected] " , "orderdate" : datetime(2019 , 5 , 28 , 19 , 13 , 32 ), "product_id" : "z9y8x7w6" , "value" : 5.01 , }, { "customer_id" : "[email protected] " , "orderdate" : datetime(2020 , 1 , 8 , 25 , 37 ), "product_id" : "ff11gg22hh33" , "value" : 63.13 , }, { "customer_id" : "[email protected] " , "orderdate" : datetime(2020 , 12 , 26 , 8 , 55 , 46 ), "product_id" : "a1b2c3d4" , "value" : 429.65 , }, ]
orders_coll.insert_many(order_data)
product_data = [ { "id" : "a1b2c3d4" , "name" : "Asus Laptop" , "category" : "ELECTRONICS" , "description" : "Good value laptop for students" , }, { "id" : "z9y8x7w6" , "name" : "The Day Of The Triffids" , "category" : "BOOKS" , "description" : "Classic post-apocalyptic novel" , }, { "id" : "ff11gg22hh33" , "name" : "Morphy Richardds Food Mixer" , "category" : "KITCHENWARE" , "description" : "Luxury mixer turning good cakes into great" , }, { "id" : "pqr678st" , "name" : "Karcher Hose Set" , "category" : "GARDEN" , "description" : "Hose + nozzles + winder for tidy storage" , }, ]
products_coll.insert_many(product_data)
Before you begin following this aggregation tutorial, you must set up a
new Ruby app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
agg_tutorial.rb. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
require 'mongo' require 'bson'
uri = "<connection string>"
Mongo::Client .new(uri) do |client |
agg_db = client.use('agg_tutorials_db' )
aggregation_result.each do |doc | puts doc end
end
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Ruby Get Started guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
uri = "mongodb+srv://mongodb-example:27017"
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
orders = agg_db[: orders ] products = agg_db[: products ]
orders.delete_many({}) products.delete_many({})
orders.insert_many( [ { customer_id: "[email protected] " , orderdate: DateTime.parse("2020-05-30T08:35:52Z" ), product_id: "a1b2c3d4" , value: 431.43 , }, { customer_id: "[email protected] " , orderdate: DateTime.parse("2019-05-28T19:13:32Z" ), product_id: "z9y8x7w6" , value: 5.01 , }, { customer_id: "[email protected] " , orderdate: DateTime.parse("2020-01-01T08:25:37Z" ), product_id: "ff11gg22hh33" , value: 63.13 , }, { customer_id: "[email protected] " , orderdate: DateTime.parse("2020-12-26T08:55:46Z" ), product_id: "a1b2c3d4" , value: 429.65 , }, ] )
products.insert_many( [ { id: "a1b2c3d4" , name: "Asus Laptop" , category: "ELECTRONICS" , description: "Good value laptop for students" , }, { id: "z9y8x7w6" , name: "The Day Of The Triffids" , category: "BOOKS" , description: "Classic post-apocalyptic novel" , }, { id: "ff11gg22hh33" , name: "Morphy Richardds Food Mixer" , category: "KITCHENWARE" , description: "Luxury mixer turning good cakes into great" , }, { id: "pqr678st" , name: "Karcher Hose Set" , category: "GARDEN" , description: "Hose + nozzles + winder for tidy storage" , }, ] )
Before you begin following this aggregation tutorial, you must set up a
new Rust app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
agg-tutorial.rs. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
use mongodb::{ bson::{doc, Document}, options::ClientOptions, Client, }; use futures::stream::TryStreamExt;use std::error::Error;
#[tokio::main] async fn main () mongodb::error::Result <()> { let uri = "<connection string>" ; let client = Client::with_uri_str (uri).await ?;
let agg_db = client.database ("agg_tutorials_db" );
let mut pipeline = Vec::new ();
let mut results = some_coll.aggregate (pipeline).await ?; while let Some (result) = results.try_next ().await ? { println! ("{:?} \n " , result); } Ok (()) }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Rust Quick Start guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string assignment resembles
the following:
let uri = "mongodb+srv://mongodb-example:27017" ;
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
First, create Rust structs to model the data in the orders and products
collections:
#[derive(Debug, Serialize, Deserialize)] struct Order { customer_id: String , order_date: DateTime, product_id: String , value: f32 , }
#[derive(Debug, Serialize, Deserialize)] struct Product { id: String , name: String , category: String , description: String , }
To create the orders and products collections and insert the
sample data, add the following code to your application:
let orders : Collection<Order> = agg_db.collection ("orders" );let products : Collection<Product> = agg_db.collection ("products" );
orders.delete_many (doc! {}).await ?; products.delete_many (doc! {}).await ?;
let order_docs = vec! [ Order { customer_id: "[email protected] " .to_string (), order_date: DateTime::builder ().year (2020 ).month (5 ).day (30 ).hour (8 ).minute (35 ).second (52 ).build ().unwrap (), product_id: "a1b2c3d4" .to_string (), value: 431.43 , }, Order { customer_id: "[email protected] " .to_string (), order_date: DateTime::builder ().year (2019 ).month (5 ).day (28 ).hour (19 ).minute (13 ).second (32 ).build ().unwrap (), product_id: "z9y8x7w6" .to_string (), value: 5.01 , }, Order { customer_id: "[email protected] " .to_string (), order_date: DateTime::builder ().year (2020 ).month (1 ).day (1 ).hour (8 ).minute (25 ).second (37 ).build ().unwrap (), product_id: "ff11gg22hh33" .to_string (), value: 63.13 , }, Order { customer_id: "[email protected] " .to_string (), order_date: DateTime::builder ().year (2020 ).month (12 ).day (26 ).hour (8 ).minute (55 ).second (46 ).build ().unwrap (), product_id: "a1b2c3d4" .to_string (), value: 429.65 , }, ]; orders.insert_many (order_docs).await ?;
let product_docs = vec! [ Product { id: "a1b2c3d4" .to_string (), name: "Asus Laptop" .to_string (), category: "ELECTRONICS" .to_string (), description: "Good value laptop for students" .to_string (), }, Product { id: "z9y8x7w6" .to_string (), name: "The Day Of The Triffids" .to_string (), category: "BOOKS" .to_string (), description: "Classic post-apocalyptic novel" .to_string (), }, Product { id: "ff11gg22hh33" .to_string (), name: "Morphy Richardds Food Mixer" .to_string (), category: "KITCHENWARE" .to_string (), description: "Luxury mixer turning good cakes into great" .to_string (), }, Product { id: "pqr678st" .to_string (), name: "Karcher Hose Set" .to_string (), category: "GARDEN" .to_string (), description: "Hose + nozzles + winder for tidy storage" .to_string (), }, ]; products.insert_many (product_docs).await ?;
Before you begin following an aggregation tutorial, you must set up a
new Scala app. You can use this app to connect to a MongoDB
deployment, insert sample data into MongoDB, and run the aggregation
pipeline.
After you install the driver, create a file called
AggTutorial.scala. Paste the following code in this file to create an
app template for the aggregation tutorials.
Important In the following code, read the code comments to find the sections of
the code that you must modify for the tutorial you are following.
If you attempt to run the code without making any changes, you will
encounter a connection error.
package org.example;
import org.mongodb.scala.MongoClient import org.mongodb.scala.bson.Document import org.mongodb.scala.model.{Accumulators , Aggregates , Field , Filters , Variable }
import java.text.SimpleDateFormat
object FilteredSubset {
def main (args: Array [String ]): Unit = {
val uri = "<connection string>" val mongoClient = MongoClient (uri) Thread .sleep(1000 )
val aggDB = mongoClient.getDatabase("agg_tutorials_db" )
val dateFormat = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss" )
Thread .sleep(1000 )
Thread .sleep(1000 ) mongoClient.close() } }
For every tutorial, you must replace the connection string placeholder with
your deployment's connection string.
Tip To learn how to locate your deployment's connection string, see the
Create a Connection String
step of the Scala Driver Get Started guide.
For example, if your connection string is
"mongodb+srv://mongodb-example:27017", your connection string
assignment resembles the following:
val uri = "mongodb+srv://mongodb-example:27017"
This example uses two collections:
An order can only contain one product. The aggregation uses a
one-to-one join to match an order document to the corresponding product
document. The aggregation joins the collections by the product_id field
that exists in documents in both collections.
To create the orders and products collections and insert the
sample data, add the following code to your application:
val orders = aggDB.getCollection("orders" )val products = aggDB.getCollection("products" )
orders.deleteMany(Filters .empty()).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
products.deleteMany(Filters .empty()).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
val dateFormat = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss" )
orders.insertMany( Seq ( Document ( "customer_id" -> "[email protected] " , "orderdate" -> dateFormat.parse("2020-05-30T08:35:52" ), "product_id" -> "a1b2c3d4" , "value" -> 431.43 ), Document ( "customer_id" -> "[email protected] " , "orderdate" -> dateFormat.parse("2019-05-28T19:13:32" ), "product_id" -> "z9y8x7w6" , "value" -> 5.01 ), Document ( "customer_id" -> "[email protected] " , "orderdate" -> dateFormat.parse("2020-01-01T08:25:37" ), "product_id" -> "ff11gg22hh33" , "value" -> 63.13 ), Document ( "customer_id" -> "[email protected] " , "orderdate" -> dateFormat.parse("2020-12-26T08:55:46" ), "product_id" -> "a1b2c3d4" , "value" -> 429.65 ) ) ).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
products.insertMany( Seq ( Document ( "id" -> "a1b2c3d4" , "name" -> "Asus Laptop" , "category" -> "ELECTRONICS" , "description" -> "Good value laptop for students" ), Document ( "id" -> "z9y8x7w6" , "name" -> "The Day Of The Triffids" , "category" -> "BOOKS" , "description" -> "Classic post-apocalyptic novel" ), Document ( "id" -> "ff11gg22hh33" , "name" -> "Morphy Richardds Food Mixer" , "category" -> "KITCHENWARE" , "description" -> "Luxury mixer turning good cakes into great" ), Document ( "id" -> "pqr678st" , "name" -> "Karcher Hose Set" , "category" -> "GARDEN" , "description" -> "Hose + nozzles + winder for tidy storage" ) ) ).subscribe( _ => {}, e => println("Error: " + e.getMessage), )
The following steps demonstrate how to create and run an aggregation
pipeline to join collections on a single common field.
MongoDB Shell
C
C++11
C#
Go
Java (Sync)
Kotlin (Coroutine)
Node.js
PHP
Python
Ruby
Rust
Scala
db.orders .aggregate ( [
{ $match : { orderdate : { $gte : new Date ("2020-01-01T00:00:00Z" ), $lt : new Date ("2021-01-01T00:00:00Z" ) } } },
{ $lookup : { from : "products" , localField : "product_id" , foreignField : "p_id" , as : "product_mapping" } },
{ $set : { product_mapping : { $first : "$product_mapping" } } }, { $set : { product_name : "$product_mapping.name" , product_category : "$product_mapping.category" } },
{ $unset : ["_id" , "product_id" , "product_mapping" ] } ] )
In this example, the $lookup stage always outputs a
product_mapping array that contains one document. The $set
stage after the $lookup stage uses $first to extract the
document from the product_mapping array. If you use this
pipeline in a setting where the $lookup stage outputs an array
of more than one document, consider using an explicit { $limit:
1 } stage in the $lookup stage.
Note If a supporting index on the foreignField does not exist, a
$lookup operation that performs an equality match with a single
join will likely have poor performance. For more information,
see and Lookup Performance Considerations and
Create an Index.
The aggregated results contain three documents. The documents
represent customer orders that occurred in 2020, with the
product_name and product_category of the ordered product:
{ customer_id: '[email protected] ', orderdate: ISODate('2020-05-30T08:35:52.000Z'), value: 431.43, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' } { customer_id: '[email protected] ', orderdate: ISODate('2020-01-01T08:25:37.000Z'), value: 63.13, product_name: 'Morphy Richardds Food Mixer', product_category: 'KITCHENWARE' } { customer_id: '[email protected] ', orderdate: ISODate('2020-12-26T08:55:46.000Z'), value: 429.65, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' }
The result consists of documents that contain fields from
documents in the orders collection and the products collection
joined by matching the product_id field present in each original
document.
Add a $match stage that matches
orders placed in 2020:
"{" , "$match" , "{" ,"orderdate" , "{" ,"$gte" , BCON_DATE_TIME(1577836800000UL ),"$lt" , BCON_DATE_TIME(1609459200000UL ),"}" ,"}" , "}" ,
Next, add a $lookup stage. The
$lookup stage joins the product_id field in the orders
collection to the id field in the products collection:
"{" , "$lookup" , "{" ,"from" , BCON_UTF8("products" ),"localField" , BCON_UTF8("product_id" ),"foreignField" , BCON_UTF8("id" ),"as" , BCON_UTF8("product_mapping" ),"}" , "}" ,
Next, add two $set stages to the pipeline.
The first $set stage sets the product_mapping field
to the first element in the product_mapping object
created in the previous $lookup stage.
The second $set stage creates two new fields, product_name
and product_category, from the values in the
product_mapping object field:
"{" , "$set" , "{" , "product_mapping" , "{" , "$first" , BCON_UTF8("$product_mapping" ), "}" , "}" ,"{" , "$set" , "{" ,"product_name" , BCON_UTF8("$product_mapping.name" ),"product_category" , BCON_UTF8("$product_mapping.category" ),"}" , "}" ,
Tip Because this is a one-to-one join, the $lookup stage
adds only one array element to the input document. The pipeline
uses the $first operator to retrieve the data from
this element.
Finally, add an $unset stage. The
$unset stage removes unnecessary fields from the document:
"{" , "$unset" , "[" , BCON_UTF8("_id" ), BCON_UTF8("product_id" ), BCON_UTF8("product_mapping" ), "]" , "}" ,
Add the following code to the end of your application to perform
the aggregation on the orders collection:
mongoc_cursor_t *results = mongoc_collection_aggregate(orders, MONGOC_QUERY_NONE, pipeline, NULL , NULL );
bson_destroy(pipeline);
Ensure that you clean up the collection resources by adding the
following line to your cleanup statements:
mongoc_collection_destroy(orders); mongoc_collection_destroy(products);
Finally, run the following commands in your shell to generate and
run the executable:
gcc -o aggc agg-tutorial.c $(pkg-config --libs --cflags libmongoc-1.0) ./aggc
Tip If you encounter connection errors by running the preceding
commands in one call, you can run them separately.
The aggregated result contains three documents. The documents
represent customer orders that occurred in 2020, with the
product_name and product_category of the ordered product:
{ "customer_id" : "[email protected] ", "orderdate" : { "$date" : { "$numberLong" : "1590822952000" } }, "value" : { "$numberDouble" : "431.43000000000000682" }, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" } { "customer_id" : "[email protected] ", "orderdate" : { "$date" : { "$numberLong" : "1577869537000" } }, "value" : { "$numberDouble" : "63.130000000000002558" }, "product_name" : "Morphy Richardds Food Mixer", "product_category" : "KITCHENWARE" } { "customer_id" : "[email protected] ", "orderdate" : { "$date" : { "$numberLong" : "1608976546000" } }, "value" : { "$numberDouble" : "429.64999999999997726" }, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }
The result consists of documents that contain fields from
documents in the orders collection and the products
collection, joined by matching the product_id field present in
each original document.
Add a $match stage that matches
orders placed in 2020:
pipeline.match (bsoncxx::from_json (R"({ "orderdate": { "$gte": {"$date": 1577836800}, "$lt": {"$date": 1609459200000} } })" ));
Next, add a $lookup stage. The
$lookup stage joins the product_id field in the orders
collection to the id field in the products collection:
pipeline.lookup (bsoncxx::from_json (R"({ "from": "products", "localField": "product_id", "foreignField": "id", "as": "product_mapping" })" ));
Next, add two $addFields
stages to the pipeline.
The first $addFields stage sets the product_mapping field
to the first element in the product_mapping object
created in the previous $lookup stage.
The second $addFields stage creates two new fields, product_name
and product_category, from the values in the
product_mapping object field:
pipeline.add_fields (bsoncxx::from_json (R"({ "product_mapping": {"$first": "$product_mapping"} })" ));pipeline.add_fields (bsoncxx::from_json (R"({ "product_name": "$product_mapping.name", "product_category": "$product_mapping.category" })" ));
Tip Because this is a one-to-one join, the $lookup stage
adds only one array element to the input document. The pipeline
uses the $first operator to retrieve the data from this element.
Finally, add an $unset stage. The
$unset stage removes unnecessary fields from the document:
pipeline.append_stage (bsoncxx::from_json (R"({ "$unset": ["_id", "product_id", "product_mapping"] })" ));
Add the following code to the end of your application to perform
the aggregation on the orders collection:
auto cursor = orders.aggregate (pipeline);
Finally, run the following command in your shell to start your
application:
c++ --std=c++17 agg-tutorial.cpp $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out
The aggregated result contains three documents. The documents
represent customer orders that occurred in 2020, with the
product_name and product_category of the ordered product:
{ "customer_id" : "[email protected] ", "orderdate" : { "$date" : "2020-05-30T06:55:52Z" }, "value" : 431.43000000000000682, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" } { "customer_id" : "[email protected] ", "orderdate" : { "$date" : "1970-01-19T06:17:41.137Z" }, "value" : 63.130000000000002558, "product_name" : "Morphy Richardds Food Mixer", "product_category" : "KITCHENWARE" } { "customer_id" : "[email protected] ", "orderdate" : { "$date" : "2020-12-26T08:55:46Z" }, "value" : 429.64999999999997726, "product_name" : "Asus Laptop", "product_category" : "ELECTRONICS" }
The result consists of documents that contain fields from
documents in the orders collection and the products
collection, joined by matching the product_id field present in
each original document.
First, start the aggregation on the orders collection and
chain a $match stage that matches orders placed in 2020: